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 Math {
	public function __call($fn_name,$fn_args) {
		$sum=0;
		foreach($fn_args as $v) {
			$sum+=$v;
		}
		echo implode(',',$fn_args).'的和是:'.$sum,'<br>';
	}
}
$math=new Math();
$math->call(10,20);
$math->call(10,20,30);
$math->call(10,20,30,40);
?>
<?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>
"); 
    //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>
"); 
//调用 __call() 
$obj->dynaMethod("Leon", "Zeev"); 
// $obj->display(array(1,2,3)); 
// $obj->display('Cat'); 
?> 
原文地址:https://www.cnblogs.com/SharkJiao/p/14117062.html