PHP中的类级允许多重继承吗?
答案 0 :(得分:37)
多重继承受到Diamond Problem的影响,但还没有(已经同意如何)在PHP中解决。因此, PHP中没有多重继承。
BaseClass
/\
/ \
ClassA ClassB
\ /
\/
ClassC
如果ClassA
和ClassB
都定义了自己的方法foo()
,您会在ClassC
中调用哪一种方法?
我们鼓励您使用object composition或interfaces(允许多重继承)或 - 如果您正在进行水平重复使用 - 请查看Decorator或Strategy模式,直到我们有Traits(或Grafts或其他任何名称。)
一些参考:
答案 1 :(得分:3)
您可以使用方法和属性委派来模仿它,但它不适用于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);
}
}
答案 2 :(得分:2)
PHP不支持多重继承,但使用traits
确实可以轻松地在多个独立类中重用方法集。 mpirun cudarun ./foo
就像一个类一样编写,但它不能自己实例化。
下面是PHP手册中的几个例子:
优先顺序示例:
$data = array('msisdn' =>'01033000939','basic'=>true);
$data_json = json_encode($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->urlFullSubs);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS,$data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data_json)));
$response = curl_exec($ch);
$s = curl_error($ch);
curl_close($ch);
return $response;
输出:
trait
以下是解决冲突的另一个例子:
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();
有关 PHP中的多个Inhertance 的更多信息和更深入的理解。
答案 3 :(得分:1)
否,PHP不支持多重继承。
要在PHP中允许此功能,可以使用接口,也可以使用“特性”代替类。
PHP 5.4.0带有特征,它将满足多重继承限制。从下面的给定链接中了解有关性状的更多信息: