PHP中有多态么

PHP中有多态么

一、总结

一句话总结:封装是类的构建过程,php具有;php也具有继承的特性。唯独这个多态,php体现的十分模糊。原因是php是弱类型语言。

php不具有像java那种清晰的多态,不是代表php不具有多态性。

 

1、多态是什么?

多态其实就是根据参数不同而执行不同的方法。

 

2、php多态实例?

 1 abstract class animal{
 2     abstract function fun();  3 }  4 class cat extends animal{  5 function fun(){  6 echo "cat say miaomiao...";  7  }  8 }  9 class dog extends animal{ 10 function fun(){ 11 echo "dog say wangwang..."; 12  } 13 } 14 function work($obj){ 15 if($obj instanceof animal){ 16 $obj -> fun(); 17 }else{ 18 echo "no function"; 19  } 20 } 21 work(new dog()); 22 work(new cat());

  上面通过一个关键字instanceof来判断,变量指向的对象是否是animal类的一个实例,下面new cat(),new dog()都是animal子类的对象,而输出了“dog say wangwang...”和“cat say miaomiao...”,说明子类对象是父类的一个实例,从而达到了java多态的功能。

 

3、java的多态分哪两类?

父类引用指向子类对象;接口引用指向实现接口的类对象。

 

 

二、PHP中的多态

多态的概念一般是强类型语言来谈的,因为强类型语言它必须要声明参数类型,比如一个手电筒对象的打开方法其参数申明了只能是蓝光,就不能传其他光。但可以用父类渲染的方式使其多态,比如声明一个光的父类,让其它颜色的光都继承自这个光的父类,申明其参数为父类光,然后传光的任何子类都可以;这就是强类型的多态;

但php是弱类型的动态语言,不检测参数类型,传什么都可以;但在php5.3版本可以声明参数为某对象;当声明参数为某类实例化后的对象时,就得用父类渲染的方式令其多态;

<?php
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 />'; 
    } 
} 

class Light { 
    public function ons(Glass $g) { 
    //这里的$g对象必须是由Glass或Glass的子类实例化而来;本用法只能在php5.3里面使用;   
    //如果在遵循了PSR规范的框架里面,这里的Glass类同样可以写成这样的模式 Home\Controller\Glass $g
    //用玻璃渲染颜色 
    $g->display(); 
    } 
} 
// 造手电筒 
$light = new Light(); 
// 造红玻璃 
$red = new RedGlass(); 
// 造蓝玻璃 
$blue = new BlueGlass(); 

// 红灯亮 
$light->ons($red); //把对象传进方法内;

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

// 猪八戒降生 
$pig = new Pig(); //$pig不是由Glass或Glass的子类实例化,所以会报错了;
$light->ons($pig);  
?>
 
多态其实就是根据参数不同而执行不同的方法。
 
 
参考:PHP中的多态 - 菜问 - 博客园
https://www.cnblogs.com/nixi8/p/4933890.html
 
 
 
 

三、php多态的理解

  php是面向对象的脚本语言,而我们都知道,面向对象的语言具有三大特性:封装,继承,多态。php理应具有这三大特性。

  封装是类的构建过程,php具有;php也具有继承的特性。唯独这个多态,php体现的十分模糊。原因是php是弱类型语言。

  java的多态体现的十分清晰,大体分两类:父类引用指向子类对象;接口引用指向实现接口的类对象。java声明变量时都要给变量设定类型,所以存在什么父类引用和接口引用。而php则没有这点体现,php声明变量不需要给变量设定类型,一个变量可以指向不同的数据类型。所以,php不具有像java一样的多态。

  php不具有像java那种清晰的多态,不是代表php不具有多态性。看下面一个例子:

 1 abstract class animal{
 2     abstract function fun();
 3 }
 4 class cat extends animal{
 5     function fun(){
 6         echo "cat say miaomiao...";
 7     }
 8 }
 9 class dog extends animal{
10     function fun(){
11         echo "dog say wangwang...";
12     }
13 }
14 function work($obj){
15     if($obj instanceof animal){
16         $obj -> fun();
17     }else{
18         echo "no function";
19     }
20 }
21 work(new dog()); 
22 work(new cat());

  上面通过一个关键字instanceof来判断,变量指向的对象是否是animal类的一个实例,下面new cat(),new dog()都是animal子类的对象,而输出了“dog say wangwang...”和“cat say miaomiao...”,说明子类对象是父类的一个实例,从而达到了java多态的功能。

  上边的类是抽象类,也表明了接口与实现接口的类对象同样可以适用。

  至此,得出php虽然多态体现模糊,但还是具有多态特性的。

 
 
参考:php多态的理解 - age - 博客园
https://www.cnblogs.com/age0420/p/3469850.html
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值