• 技术文章 >后端开发 >php教程

    如何实现php中模拟多继承

    不言不言2018-07-05 10:55:26原创1013
    这篇文章主要介绍了关于如何实现php中模拟多继承,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

    php中模拟多继承如何实现

    一、总结

    一句话总结:其实你继承别人也是想调用别人类里面的方法和属性,所以可以这样做:这本类中创建目标类的对象,然后通过这个对象来调用方法和属性,这样比继承来的方便。

    二、魔术方法 __call 实现模拟多继承

    1、相关知识

    PHP没有多继承的特性。即使是一门支持多继承的编程语言,我们也很少会使用这个特性。在大多数人看来,多继承不是一种好的设计方法。想要给某个类添加额外的特性,不一定要使用继承。这里我提供一种模拟多继承的方法以供参考。

    PHP有一个魔术方法,叫做__call。当你调用一个不存在的方法时,这个方法会被自动调用。这时,我们就有机会将调用重定向到一个存在的方法。继承多个父类的子类,寻找方法的过程一般是这样的:

    本身的方法 -> 父类1的方法 -> 父类2的方法...

    模拟过程大致是这样:将各个父类实例化,然后作为子类的属性。这些父类提供一些公有的方法。当子类拥有某方法时,__call()函数不会被调用。这相当于“覆盖”了父类的方法。当调用了不存在的方法时,通过__call()方法依次从父类中寻找可以调用的方法。虽然这不是完备的多继承,但可以帮助我们解决问题。

     1 <?php 
     2 class Parent1 { 
     3     function method1() {} 
     4     function method2() {} 
     5 } 
     6 class Parent2 { 
     7     function method3() {} 
     8     function method4() {}
     9 }
     10 class Child {
     11     protected $_parents = array();
     12     public function Child(array $parents=array()) {
     13         $_parents = $parents;
     14     }
     15      
     16     public function __call($method, $args) {
     17         // 从“父类"中查找方法
     18         foreach ($this->_parents as $p) {
     19             if (is_callable(array($p, $method))) {
     20                 return call_user_func_array(array($p, $method), $args);
     21             }
     22         }
     23         // 恢复默认的行为,会引发一个方法不存在的致命错误
     24         return call_user_func_array(array($this, $method), $args);
     25     }
     26 }
     27 $obj = new Child(array(new Parent1(), new Parent2()));
     28 $obj->method1();
     29 $obj->method3();

    这里没有涉及属性的继承,但实现起来并不困难。可以通过__set()和__get()魔术方法来模拟属性的继承。请你动手实践。

    其它方法:通过接口来实现多继承

    php中的类只能继承一个父类,如果要继承多个类应采用接口

    interface 模拟多继承

    三、PHP接口实现多继承详解

    在PHP的接口中,接口可以继承接口。虽然PHP类只能继承一个父类(单继承),但是接口和类不同,接口可以实现多继承,可以继承一个或者多个接口。当然接口的继承也是使用extends关键字,要多个继承的话只要用逗号把继承的接口隔开即可。

    需要注意的是当你接口继承其它接口时候,直接继承父接口的静态常量属性和抽象方法,所以类实现接口时必须实现所有相关的抽象方法

    现在你对PHP接口的继承有所了解了吧,下面的例子可供参考,代码如下:

    <?php 
    interface father{ 
    function shuchu(); 
    }  
    interface fam extends father{ 
    function cook($name); 
    }  
    class test implements fam{ 
    function shuchu(){ 
    echo "接口继承,要实现两个抽象方法"; 
    echo "<br>"; 
    }  
    function cook($name){ 
    echo "平时经常做饭的人是:".$name;  
    }  
    }  
    $t=new test(); 
    $t->shuchu(); 
    $t->cook("妈妈");  
    ?>

    代码运行结果如下:

    接口继承,要实现两个抽象方法
    平时经常做饭的人是:妈妈

    上面的示例是接口继承了一个接口,所以在test类实现fam接口的时候要实例两个抽象方法,就是把接口的子类和父类的抽象方法都实例。

    下面来看一个接口多继承的示例,代码如下:

    <?php 
    interface father{ 
    function shuchu(); 
    } 
    interface mother{ 
    function dayin($my); 
    } 
    interface fam extends father,mother{ 
    function cook($name); 
    } 
    class test implements fam{ 
    function dayin($my){ 
    echo "我的名字是:".$my;  
    echo "<br>"; 
    } 
    function shuchu(){ 
    echo "接口继承,要实现两个抽象方法"; 
    echo "<br>"; 
    } 
    function cook($name){ 
    echo "平时经常做饭的人是:".$name;  
    } 
    } 
    $t=new test(); 
    $t->shuchu(); 
    $t->dayin("小强");  
    $t->cook("妈妈");  
    ?>

    示例运行结果:

    接口继承,要实现两个抽象方法
    我的名字是:小强
    平时经常做饭的人是:妈妈

    这段代码由于接口继承了两个接口,所有实例时要把这三个抽象类的所有抽象方法都实例,总共有三个。看完这两个例子,你应该对接口的继承熟悉了吧,其实就一个单继承和多继承,只要实现了所有相关的抽象方法就可以了。

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    PHP中的操作mysqli的预处理prepare

    初步进行PHP多进程编程的介绍

    关于PHP多态的理解

    以上就是如何实现php中模拟多继承的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php中模拟多继承
    上一篇:php实现微信支付的代码 下一篇:php生成唯一订单号的5种方法
    千万级数据并发解决方案

    相关文章推荐

    • 100道常见PHP面试题(附解析),增强你的知识储备!• 常用的php对象类型判断_PHP• GD输出汉字的函数的分析_PHP• PHP文件上传的具体思路及实现_PHP• 发布一个图形数字验证代码_PHP
    1/1

    PHP中文网