多态

<?php 
class Light
{
	//开灯,传一个玻璃参数
 	public function ons($g){
 		$g->display();
	}
}

class RedGlass
{
	public function display(){
		echo "red light<br>";
	}
}

class BlueGlass
{
	public function display(){
		echo "blue right<br>";
	}
}

class GreenGlass
{
	public function display(){
		echo "green right<br>";
	}
}

class Pig
{
	public function display(){
		echo "八戒哼哼坠地.<br />";
	}
}

//创建一个手电筒
$light = new Light();

//创建3块玻璃
$red = new RedGlass();
$blue = new BlueGlass();
$green = new GreenGlass();

//变红灯
$light->ons($red);
//变蓝灯
$light->ons($blue);
//变绿灯
$light->ons($green);

//调用错了
$pig = new Pig();
$light->ons($pig);

因为php是弱类型动态语言,所以php没报错

一个变量

$var = 8;
$var = 'hello';
$var = new Pig();

一个变量,没有类型,你装什么类型都行

同理,传参,参数也没有强制类型,
所以,对于PHP动态语言来说,岂止是多态,简直是变态

又有专家说,你这个太灵活了,简直bt
否则我们就不说你多态

答: 别急,我们不让php这么灵活还不行吗?
我对参数对类型限制还不行吗 (往下看)

参数限制

<?php 

class Light
{
	//此处,仿java,也加一个类名,做参数类型检测
 	public function ons(RedGlass $g){
 		$g->display();
	}
}

class RedGlass
{
	public function display(){
		echo "red light";
	}
}

class BlueGlass
{
	public function display(){
		echo "blue right";
	}
}

class GreenGlass
{
	public function display(){
		echo "green right";
	}
}

class Pig
{
	public function display(){
		echo "八戒哼哼坠地.<br />";
	}
}


//造手电筒
$light = new Light();

//造红玻璃
$red = new RedGlass();
//造蓝玻璃
$blue = new BlueGlass();


//红灯亮
$light->ons($red);

//蓝灯亮
$light->ons($blue);

Catchable fatal error: Argument 1 passed to Light::ons() must be an instance of RedGlass, instance of BlueGlass given, called in D:\wamp2\www\PHPoop\493poly2.php on line 53 and defined in D:\wamp2\www\PHPoop\493poly2.php on line 6

加了类型检测后,果然传蓝玻璃不行
解决:参数定为父类,传其子类

哲学:子类是父类,例如:男人是人,白马是马,蓝玻璃是玻璃

里氏代换: 原能用父类的场合,都可以用子类来代替(往下看)

里氏代换

<?php 

class Light
{
	//此处,仿java,也加一个类名,做参数类型检测
 	public function ons(Glass $g){
 		$g->display();
	}
}

class Glass
{
	public function display(){}
}

class RedGlass extends Glass
{
	public function display(){
		echo "red light.<br />";
	}
}

class BlueGlass extends Glass
{
	public function display(){
		echo "blue right.<br />";
	}
}

class GreenGlass extends Glass
{
	public function display(){
		echo "green right.<br />";
	}
}

class Pig
{
	public function display(){
		echo "八戒哼哼坠地.<br />";
	}
}


//造手电筒
$light = new Light();

//造红玻璃
$red = new RedGlass();
//造蓝玻璃
$blue = new BlueGlass();


//红灯亮
$light->ons($red);

//蓝灯亮
$light->ons($blue);


//调用错了
$pig = new Pig();
$light->ons($pig);

如果按PHP本省特点,不检测类型,
本省就可以说是多态的,甚至是变态的

但是在php5.3之后引入了对象类型的参数检测
注意:只能检测对象所属的类

其实,对于php来说,限制了其灵活性,达到了java中多态的效果

反思多态:
其实就是只抽象的声明父类,具体的工作由子类对象来完成