PHP基础知识系列:多态性

多态性:所谓多态性是指一段程序能够处理多种类型对象的能力,多态就是把子类对象赋值给父类引用,然后调用父类的方法,去执行子类覆盖父类的那个方法,但在PHP里是弱类型的,对象引用都是一样的不分父类引用,还是子类引用。

多 态(Polymorphism)按字面上意思理解就是“多种形状”。可以理解为多种表现形式,也即“一个对外接口,多个内部实现方法”。在面向对象的理论 中,多态性的一般定义为:同一个操作作用于不同的类的实例,将产生不同的执行结果。也即不同类的对象收到相同的消息时,将得到不同的结果。

在实际的应用开发中,采用面向对象中的多态主要在于可以将不同的子类对象都当作一个父类来处理,并且可以屏蔽不同子类对象之间所存在的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

 

  我们现在来看一个例子,首先还是要使用多态就要有父类对象和子类对象的关系。做一个形状的接口或是抽象类做为父类,里面有两个抽象方法,一个求 周长的方法,另一个是求面积的方法;这接口的子类是多种不同的形状,每个形状又都有周长和面积,又因为父类是一个接口,所以子类里面就必须要实现父类的这 两个周长和面积的抽象方法,这样做的目的是每种不同形状的子类都遵守父类接口的规范,都要有求周长和求面积的方法。

多态性

//定义了一个形状的接口,里面有两个抽象方法让子类去实现 
interface Shape { 
  function area(); 
  function  perimeter(); 
} 

//定义了一个矩形子类实现了形状接口中的周长和面积 
class Rect implements Shape { 
  private $width; 
  private $height; 

  function __construct($width, $height) { 
    $this->width=$width; 
    $this->height=$height; 
  } 

  function area() { 
    return "矩形的面积是:".($this->width*$this->height); 
  } 

  function perimeter() { 
    return "矩形的周长是:".(2*($this->width+$this->height)); 
  } 
} 

//定义了一个圆形子类实现了形状接口中的周长和面积 
class  Circular implements Shape { 
  private $radius; 

  function __construct($radius) { 
    $this->radius=$radius; 
  } 

  function area() { 
    return "圆形的面积是:".(3.14*$this->radius*$this->radius);
  } 

  function perimeter() { 
    return "圆形的周长是:".(2*3.14*$this->radius); 
  } 
} 

function area($obj){ //定义处理方法 
  if($obj instanceof Shape ){ 
    $obj->area(); 
  }else{ 
    echo "Error: 对象错误!"; 
  } 
}

function perimeter($obj){ //定义处理方法 
  if($obj instanceof Shape ){ 
    $obj->perimeter(); 
  }else{ 
    echo "Error: 对象错误!"; 
  } 
}
//调用形式


//把子类矩形对象赋给形状的一个引用 
$shape=new Rect(5, 10); 
echo area($shape);
echo perimeter($shape);

echo $shape->area()."<br>"; 
echo $shape->perimeter()."<br>"; 

     
//把子类圆形对象赋给形状的一个引用 
$shape=new Circular(10);
echo area($shape); 
echo perimeter($shape);

echo $shape->area()."<br>"; 
echo $shape->perimeter()."<br>"; 

上例执行结果:

矩形的面积是:50
矩形的周长是:30
圆形的面积是:314
圆形的周长是:62.8

通过上例我们看到,把矩形对象和圆形对象分别赋给了变量$shape, 调用$shape引用中的面积和周长的方法,出现了不同的结果,这就是一种 多态的应用,其实在我们PHP这种弱类形的面向对象的语言里面,多态的特性并不是特别的明显,其实就是对象类型变量的变项应用。

首先创建一个员工父类,所有的员工类将继承自该员工父类,并且继承父类的所有方法与属性。然后在员工类中创建“是一”关系,判断是否为合法的员工。

    class employee{                            //定义员工父类
        protected function working(){                //定义员工工作,需要在子类的实现
            echo "本方法需要在子类中重载!";
        }
    }
    class painter extends employee{                    //定义油漆工类
        public function working(){                //实现继承的工作方法
            echo "油漆工正在刷漆!\n";
        }
    }
    class typist extends employee{                    //定义打字员类
        public function working(){
            echo "打字员正在打字!\n";
        }
    }
    class manager extends employee{                    //定义经理类
        public function working(){
            echo "经理正在开会!";
        }
    }
    function printworking($obj){                    //定义处理方法
        if($obj instanceof employee){                //若是员工对象,则显示其工作状态
            $obj->working();
        }else{                            //否则显示错误信息
            echo "Error: 对象错误!";
        }
    }
    printworking(new painter());                    //显示油漆工的工作
    printworking(new typist());                    //显示打字员的工作
    printworking(new manager());                    //显示经理的工作

  //结果:油漆工正在刷漆! 打字员正在打字! 经理正在开会!


首先定义一个员工基类,并定义一个员工工作状态,然后定义继承自员工基类的三个员工类并实现了基类中的方法。最后定义显示员工工作状态的方法。

此时无论增加多少员工类,只要继承基类并覆盖基类的方法working()就可以了。

参考1:http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/09/11/1824194.html

参考2:http://phperbar.blog.163.com/blog/static/162596182201052184223529/

原文地址:https://www.cnblogs.com/colorstory/p/2676802.html