【发布时间】:2018-04-04 21:29:23
【问题描述】:
PHP 中的类级别是否允许多重继承?
【问题讨论】:
-
我相信这里接受的答案应该改变,因为在 PHP 中有一个针对
multiple inheritance的解决方法。这在this answer 中有描述,但在接受的答案中没有。
标签: php oop multiple-inheritance
PHP 中的类级别是否允许多重继承?
【问题讨论】:
multiple inheritance 的解决方法。这在this answer 中有描述,但在接受的答案中没有。
标签: php oop multiple-inheritance
您可以使用方法和属性委托来模仿它,但它不适用于 is_a() 或 instanceof:
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 中启用此功能,您可以使用接口,也可以使用“特征”而不是类。
PHP 5.4.0 带有特征,它将满足多重继承的限制。从下面的给定链接中阅读有关特征的更多信息:
【讨论】:
PHP 本身并不支持多重继承,但它确实提供了一些在多个独立类中重用方法集的便利,使用 traits。 trait 就像一个类一样编写,但它不能自己实例化。
以下是 PHP 手册中的几个示例:
优先顺序示例:
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();
输出:
Hello World!
这是另一个解决冲突的例子:
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 中的多重继承的更多信息和更深入的了解。
【讨论】:
多重继承受到Diamond Problem 的影响,这在PHP 中尚未(就如何解决达成一致)得到解决。因此,PHP 中没有多重继承。
BaseClass
/\
/ \
ClassA ClassB
\ /
\/
ClassC
如果ClassA 和ClassB 都定义了自己的方法foo(),你会在ClassC 中调用哪一个?
我们鼓励您使用object composition 或interfaces(允许多重继承),或者-如果您在水平重用-查看Decorator 或Strategy 模式,直到我们有Traits(或Grafts 或其他任何名称)。
一些参考:
【讨论】: