PHP中的类级别允许多重继承吗?

时间:2010-04-22 12:54:54

标签: php oop multiple-inheritance

PHP中的类级允许多重继承吗?

4 个答案:

答案 0 :(得分:37)

多重继承受到Diamond Problem的影响,但还没有(已经同意如何)在PHP中解决。因此, PHP中没有多重继承

    BaseClass
       /\
      /  \
 ClassA  ClassB
      \  /
       \/
     ClassC

如果ClassAClassB都定义了自己的方法foo(),您会在ClassC中调用哪一种方法?

我们鼓励您使用object compositioninterfaces(允许多重继承)或 - 如果您正在进行水平重复使用 - 请查看DecoratorStrategy模式,直到我们有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 的更多信息和更深入的理解。

查看Horizontal Reuse for PHP

答案 3 :(得分:1)

否,PHP不支持多重继承。

要在PHP中允许此功能,可以使用接口,也可以使用“特性”代替类。

PHP 5.4.0带有特征,它将满足多重继承限制。从下面的给定链接中了解有关性状的更多信息:

http://php.net/manual/en/language.oop5.traits.php