PHP面向物件之多型
阿新 • • 發佈:2020-12-10
面向物件三大特性
- 特性
- 封裝
- 繼承
- 多型
多型
- 多型分為兩種:方法重寫和方法過載
方法重寫
- 子類重寫了父類的同名的方法
- 子類的方法必須和父類的方法同名
- 引數個數要一致
- 子類修飾的不能比父類更加嚴格
<?php class A{ protected function say($name){ echo $name,',狗!<br/>'; } protected function says($name){ echo $name,',狗!<br/>'; } } class B extends A{ public function say($name){ echo $name,',貓!<br/>'; } } $per= new B(); $per->say('Sunny'); $per->says('Sunny'); ?>
方法過載
- 方法過載
- 在同一個類中,有多個同名的函式,通過引數的不同來區分不同的方法
- PHP不支援方法過載,但是PHP可以通過其他方法來模擬方法過載
<?php class Overloader { private $properties= array(); function __get($property_name){ if(isset($this->properties[$property_name])){ return($this->properties[$property_name]); }else{ return(NULL); } } function __set($property_name, $value){ $this->properties[$property_name]= $value; } public function __call($method, $p){ print("Invoking $method()<br>\n"); //print("Arguments: "); //print_r($args); if($method == 'display'){ if(is_object($p[0])) $this->displayObject($p[0]); else if(is_array($p[0])) $this->displayArray($p[0]); else $this->displayScalar($p[0]); } } public function displayObject($p){ echo ("你傳入的是個物件,內容如下:<br>"); print_r($p); echo "<hr>"; } public function displayArray($p){ echo ("你傳入的是個陣列,內容如下:<br>"); print_r($p); echo "<hr>"; } public function displayScalar($p){ echo ("你傳入的是個單獨變數,內容如下:<br>" . $p); echo "<hr>"; } } $obj= new Overloader(); //呼叫 __set() 給一個不存在的屬性變數賦值 $obj->dynaProp = "Dynamic Content"; //呼叫 __get() print($obj->dynaProp."<br>\n"); //呼叫 __call() $obj->dynaMethod("Leon", "Zeev"); // $obj->display(array(1,2,3)); // $obj->display('Cat'); ?>