zoukankan      html  css  js  c++  java
  • 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类同样可以写成这样的模式 HomeControllerGlass $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
     
     
     
  • 相关阅读:
    F4搜索帮助 带回多个值
    ALV Tree demo(WBS元素分层显示)[引用别人的]
    WDA导出文件XLS,WORD
    采购信息记录修改[BDC]
    增强:MB1A物料价格检查
    机器学习中常见优化方法汇总
    统计模型机器学习模型领域相关知识,指标概念及问题点积累
    机器学习数学知识中令人费解的notation符号注解
    线性代数的视角理解LSR(least square regression)的参数评估算法本质
    statsmodels中的summary解读(以linear regression模型为例)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9712447.html
Copyright © 2011-2022 走看看