Is Multiple Inheritance allowed at class level in PHP?
PHP中是否允许在类级别上进行多重继承?
多重继承受到菱形问题的困扰,这个问题还没有在PHP中得到解决(商定如何解决)。因此,PHP中没有多重继承。
1 2 3 4 5 6 7 | BaseClass /\ / \ ClassA ClassB \ / \/ ClassC |
如果
我们鼓励您使用对象组合或接口(允许多重继承),或者-如果您是在水平重用之后-查看装饰器或策略模式,直到我们有了特征(或者嫁接,或者他们将被称为什么)。
一些参考:
- [php-dev]性状,嫁接,水平重复利用
- [php-dev]多类继承
- RFC:PHP的特性
- 像现在在PHP中的功能这样的特性
小精灵
您可以使用方法和属性委托来模拟它,但它不适用于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class A extends B { public function __construct($otherParent) { $this->otherParent = $otherParent; } public function __call($method, $args) { $method = [$this->otherParent, $method]; return call_user_func_array($method, $args); } } |
号
PHP不支持多重继承,但是它确实提供了一些使用
下面是PHP手册中的几个示例:
优先顺序示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Base { public function sayHello() { echo 'Hello '; } } trait SayWorld { public function sayHello() { parent::sayHello(); echo 'World!'; } } class MyHelloWorld extends Base { use SayWorld; } $o = new MyHelloWorld(); $o->sayHello(); |
输出:
1 | Hello World! |
。
下面是另一个解决冲突的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | trait A { public function smallTalk() { echo 'a'; } public function bigTalk() { echo 'A'; } } trait B { public function smallTalk() { echo 'b'; } public function bigTalk() { echo 'B'; } } class Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; } } class Aliased_Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as talk; } } |
更多信息和更深入地理解PHP中的多重含义。
PHP的水平重用研究
不,PHP不支持多重继承。
为了在PHP中使用这个特性,您可以使用接口,也可以使用"特性"而不是类。
php 5.4.0带有一些特性,可以满足多重继承限制。从下面的给定链接阅读有关特性的更多信息:
http://php.net/manual/en/language.oop5.traits.php