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

  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 ?>

 执行结果

 

张三 你好
张三 eat now
张三 再见
bool(false) set sex to 男 
bool(true) get sex value 男 
男
bool(false) 

李四 你好
李四 eat now
son eat now
李四 再见


王五 你好
王五 eat now
bool(true) 王五 再见
王五 再见

name: zhangsan age: 15
name: lisi age: 20
O:7:"PersonC":2:{s:13:"PersonCname";s:4:"lisi";s:12:"PersonCage";i:20;}
name: lisi age: 20

Ukey run
UMouse run

 

posted @ 2013-07-30 18:10  Burn_E  阅读(166)  评论(0编辑  收藏  举报