class Light {
// 开灯,传一个玻璃参数
public function ons(Glass $g) {
// 用玻璃渲染颜色
$g->display();
}
}
class Glass {
public function display() {
}
}
class RedGlass extends Glass {
public function display() {
echo '红光照耀<br >';
}
}
class BlueGlass extends Glass {
public function display() {
echo '蓝光照耀<br >';
}
}
class GreenGlass extends Glass{
public function display() {
echo '绿光照耀<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);
/*
分析:
php不报错,
是因为PHP是弱类型动态语言.
一个变量,没有类型,装什么变量都可以.
同理,传参时参数也没有强制类型.
传什么参都行.
所以,对PHP动态语言来说,岂止是多态,简直是变态.
不过我们也可以不让PHP这么灵活,那么怎么做呢?
*/
// 造手电筒
$light = new Light();
// 造红玻璃
$red = new RedGlass();
// 造蓝玻璃
$blue = new BlueGlass();
// 红灯亮
$light->ons($red);
// 蓝灯亮
$light->ons($blue);
/*
如果按PHP本身特点,不检测类型,
本身就可以说是多态的.
但是PHP5.3后,引入了对于对象类型的参数检测.
但只能检测对象所属的类
其实,这对PHP来说,限制了其灵活性.
*/