PHP多态的理解之interface接口类

什么是多态呢,我觉得可以简单的理解为,同一事物对同一行为的不同反应。

可能还是不好理解,举个例子说明一下。

动物都会叫(暂且这么认为),猫是动物,狗也是动物,狗的叫声是wang wang wang ~,而猫是miao miao miao~。

上边的例子用代码实现如下:

interface animal{  
    public function cry();  
}  
  
class cat implements animal{  
    public function cry(){  
        echo "miao~ <br>";  
    }  
}  
  
class dog implements animal{  
    public function cry(){  
        echo "wang ~ <br>";  
    }  
}  
  
function tocry(animal $obj){  
    $obj->cry();  
}  
  
  
tocry(new dog());  
tocry(new cat());  

输出

wang ~   
miao~  

接口类还有其他的应用

interface User  
{  
    public function getDiscount();  
  
    public function getUserType();  
}  
  
class VipUser implements User  
{  
    const discount = 0.8;  
  
    public function getDiscount()  
    {  
        return self::discount;  
    }  
  
    public function getUserType()  
    {  
        return "Vip User";  
    }  
}  
  
class Goods  
{  
    private $price = 100;  
    private $ur;  
  
    public function buy(User $ur)  
    {  
        $this->ur = $ur;  
        $discount = $this->ur->getDiscount();  
        $usertype = $this->ur->getUserType();  
        echo "user type is : " . $usertype . ", price is : " . $this->price * $discount;  
    }  
}  
  
$g = new Goods();  
$g->buy(new VipUser());  

上个例子中体现了多态的两个特征

  • 子类重写父类方法
  • 父类指向子类

其实php的抽象类(abstract)和接口类(interface),个人觉得都是多态的体现。虽然不如java,OC等强类型语言那么明显。但是也是多态。

个人理解,可能有不对的地方。希望大家指出,共同交流进步。