多态
<?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中多态的效果
反思多态:
其实就是只抽象的声明父类,具体的工作由子类对象来完成