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);
?>
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虽然多态体现模糊,但还是具有多态特性的。
https://www.cnblogs.com/age0420/p/3469850.html