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
     
     
     
  • 相关阅读:
    mac os programming
    Rejecting Good Engineers?
    Do Undergrads in MIT Struggle to Obtain Good Grades?
    Go to industry?
    LaTex Tricks
    Convert jupyter notebooks to python files
    How to get gradients with respect to the inputs in pytorch
    Uninstall cuda 9.1 and install cuda 8.0
    How to edit codes on the server which runs jupyter notebook using your pc's bwroser
    Leetcode No.94 Binary Tree Inorder Traversal二叉树中序遍历(c++实现)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9712447.html
Copyright © 2011-2022 走看看