由于php是弱类型语言,变量没有类型约束,所以我们只能在参数类型约束的地方体现多态。
// 训练动物的接口
interface AnimalTrain{
public function calculate($num,$num1);
}
// 抽象动物类
abstract class Animal {
public abstract function call();
}
// 猫
class Cat extends Animal implements AnimalTrain{
public function call(){
echo 'miao miao';
}
public function calculate($num,$num1){
echo $num + $num1 ;
}
}
// 狗
class Dog extends Animal implements AnimalTrain{
public function call(){
echo 'wang wang';
}
public function calculate($num,$num1){
echo $num * $num1 ;
}
}
$cat = new Cat();
$dog = new Dog();
var_dump($cat instanceof Cat); // 输出 true
var_dump($cat instanceof Animal); // 输出 true
var_dump($cat instanceof AnimalTrain); // 输出 true
var_dump($dog instanceof Dog); // 输出 true
var_dump($dog instanceof Animal); // 输出 true
var_dump($dog instanceof AnimalTrain); // 输出 true
由上面的代码我们可以看到new一个Cat,我们可以认为$cat是Cat的一个实例,也可以认为它是其父类Animal的一个实例,也可以认为它是其实现了的接口AnimalTrain的一个实例,所以我们利用php 5.1以后的参数类型约束,可以体验一把多态的快感。
// 遛小动物
class Walk{
public static function walkAnimal(Animal $animal){
echo $animal->call();
}
public static function calc(AnimalTrain $trainedAnimal,$num,$num1){
echo $trainedAnimal->calculate($num,$num1);
}
}
//遛猫让猫叫几声
Walk::walkAnimal($cat);// 输出 miao miao
//遛狗让狗叫几声
Walk::walkAnimal($dog);// 输出 wang wang
//让猫算数
Walk::calc($cat,1,2); // 输出 3
//让狗算数
Walk::calc($dog,1,2); // 输出 2
在不同的情况下表现出不同的状态,这就是我们所说的多态。
因为抽象类和接口都是不能实例化的),来实现多态。