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