1. 程式人生 > 實用技巧 >PHP面向物件之多型

PHP面向物件之多型

面向物件三大特性

  • 特性
    • 封裝
    • 繼承
    • 多型

多型

  • 多型分為兩種:方法重寫和方法過載

方法重寫

  • 子類重寫了父類的同名的方法
    • 子類的方法必須和父類的方法同名
    • 引數個數要一致
    • 子類修飾的不能比父類更加嚴格
<?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'); 
?>