如何实现php中模拟多继承

如何实现php中模拟多继承

内容导读

收集整理的这篇技术教程文章主要介绍了如何实现php中模拟多继承,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4082字,纯文字阅读大概需要6分钟

内容图文

这篇文章主要介绍了关于如何实现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中模拟多继承的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的如何实现php中模拟多继承全部内容,希望文章能够帮你解决如何实现php中模拟多继承所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com