PHP学习笔记05——面向对象

来源:互联网 发布:河南 计价软件 编辑:程序博客网 时间:2024/05/17 08:28
  1 <?php  2   3     //1. 类的声明(包括构造方法、析构方法)  4     class PersonA {  5         var $name;                    //成员属性,用var声明  6         public $age;                //当有其他修饰的时候,就不要用var了  7         private $sex;  8         function eat(){                //成员方法  9             echo $this->name." eat now<br/>";    //使用this来引用类的成员属性 10         }             11         private function run(){        //带有权限修饰的成员方法 12             echo "run now<br/>"; 13         } 14          15         function __construct($name, $age = 23) {    //构造方法,只能有一个,但可以通过默认参数实现类似于C++中的构造函数重载 16             $this->name = $name; 17             echo $name." 你好<br/>"; 18         }     19         function __destruct() {                        //析构方法,PHP中已经有垃圾回收机制,析构方法在垃圾回收程序回收对象之前自动调用 20             echo $this->name." 再见<br/>"; 21         } 22     } 23      24     //2. 类的实例化 25     $person = new PersonA("张三"); 26     $person->eat(); 27      28     //3. 类的封装 29         /* private、public修饰符 基础的oop知识,不再赘述 30          * 主要介绍以下几个魔术方法 31          * __set(propertyName, propertyValue)        使用户可以直接给private变量赋值,赋值时会调用该方法     32          * __get(propertyName)                        在获得private变量的值时调用 33          * __isset,__unset                            对private变量调用iset和unset时使用 34          */ 35     class PersonB{ 36         private $name; 37         private $sex; 38         public function __set($proName, $proValue){ 39             if ($proName == "sex") { 40                 if ($proValue != "男" && $proValue != "女") return; 41             } 42             echo "set $proName to $proValue <br/>"; 43             $this->$proName = $proValue; 44         } 45         public function __get($proName) { 46             echo "get $proName value {$this->$proName} <br/> "; 47             return $this->sex; 48         } 49         public function __isset($proName) { 50             return isset($this->$proName); 51         } 52         public function __unset($proName) { 53             unset($this->$proName); 54         } 55     } 56      57     $person = new PersonB(); 58     var_dump(isset($person->sex)); 59     $person->sex = "123"; 60     $person->sex = "男"; 61     var_dump(isset($person->sex)); 62     echo $person->sex."<br/>"; 63     unset($person->sex); 64     var_dump(isset($person->sex)); 65     echo "<br/><br/>"; 66      67     //4. 类的继承 68         /* PHP中采用的是和JAVA一样的单继承,使用extends关键字 69          * protected修饰的成员可以在子类中访问 70          * 支持重写,但子类中的方法开放程度要高于父类 71          * 使用parent::fun()可以调用父类中的方法; 72          */ 73     class PersonAson extends PersonA { 74         function eat() { 75             parent::eat(); 76             echo "son eat now<br/>"; 77         } 78     } 79     $person = new PersonAson("李四"); 80     $person->eat(); 81     unset($person);            //也可以显示调用  82     echo "<br/><br/>"; 83      84     //5. 常见的关键字和魔术方法 85         /* 常用关键字 86          * final         final修饰的类不能被继承,final修饰的方法不能被重写,注意final不能用来修饰变量 87          * static        标志类属性和类方法,为所有类共有,使用(类名::方法名)来访问,在类自身也可以用(self::方法名)来访问 88          * const        定义类常量,通常变量名都是大写,而且使用时不需要$操作符 89          * instanceof    确定一个对象是类的实例 90          * clone        使用clone拷贝一个对象 91          * 常用魔术方法 92          * __toString()    获取对象字符串表示,输出对象引用时会调用此方法 93          * __call()        调用类中不存在的方法会调用该防范,第一个参数为函数名,第二个参数为函数列表.有独特的作用. 94          * __autoload()    在用一个该文件中没有的类的时候,会自动调用该方法,可以在该方法中include类文件等操作 95          * serialize    对象串行化,以在网络中传输或者保存在文件中. 96          * unserialize    对象反串行化 97          */ 98     $person = new PersonA("王五"); 99     $personclone = clone $person;100     $personclone->eat();101     var_dump($personclone instanceof PersonA);102     unset($person);103     unset($personclone);104     echo "<br/>";105     106     class PersonC {107         private $name;108         private $age;109         public function __construct($name, $age) {110             $this->name = $name;111             $this->age = $age;112         }113         public function __toString() {114             return "name: ".$this->name." age: ".$this->age."<br/>";115         }116         public function __call($method, $args) {        //连贯操作,这里来给变量赋值,在SQL中可能会常用117             if ($method == "name")118                 $this->name = $args[0];119             else if ($method == "age")120                 $this->age = $args[0]; 121             122             return $this;123         }124     }125     $person = new PersonC("zhangsan", 15);126     echo $person;                            //这时候其实会调用toString方法127     echo $person->name("lisi")->age(20);    //巧妙使用__call方法128     129     $person_string = serialize($person);130     echo $person_string."<br/>";131     132     $person = unserialize($person_string);133     echo $person;134     echo "<br/>";135     136     //6. 抽象类与接口137         /* abstract    class    修饰抽象类,不能被实例化,里面的成员不能是private的.里面可以有抽象方法,用abstract修饰,没有任何实现.138          *                     子类必须实现所有父类的抽象方法才能实例化,否则也是抽象类.139          * interface        所有方法都是抽象方法,只能有const常量,所有成员都必须是public的,子类使用implements实现接口.140          *                     接口可以实现多个141          * 写法和JAVA基本一致,不再赘述.142          */143     144     //7. 简单多态的应用,一个简单的USB接口程序145     interface USB {146         function run();147     }148     class UKey implements USB {149         public function run() {150             echo "Ukey run<br/>";    151         }152     }153     class UMouse implements USB {154         public function run() {155             echo "UMouse run<br/>";156         }157     }    158     class Computer {159         function useUSB($usb) {160             $usb->run();161         }162     }163     $com = new Computer();164     $com->useUSB(new UKey());165     $com->useUSB(new UMouse());166 ?>

 


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>