【问题标题】:Is Multiple Inheritance allowed at class level in PHP?PHP中的类级别是否允许多重继承?
【发布时间】:2018-04-04 21:29:23
【问题描述】:

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

【问题讨论】:

标签: php oop multiple-inheritance


【解决方案1】:

您可以使用方法和属性委托来模仿它,但它不适用于 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】:

不,PHP 不支持多重继承。

要在 PHP 中启用此功能,您可以使用接口,也可以使用“特征”而不是类。

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

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

【讨论】:

    【解决方案3】:

    PHP 本身并不支持多重继承,但它确实提供了一些在多个独立类中重用方法集的便利,使用 traitstrait 就像一个类一样编写,但它不能自己实例化。

    以下是 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 中的多重继承的更多信息和更深入的了解。

    查看Horizontal Reuse for PHP

    【讨论】:

      【解决方案4】:

      多重继承受到Diamond Problem 的影响,这在PHP 中尚未(就如何解决达成一致)得到解决。因此,PHP 中没有多重继承

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

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

      我们鼓励您使用object compositioninterfaces(允许多重继承),或者-如果您在水平重用-查看DecoratorStrategy 模式,直到我们有Traits(或Grafts 或其他任何名称)。

      一些参考:

      【讨论】:

        猜你喜欢
        • 2016-10-24
        • 1970-01-01
        • 2018-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        相关资源
        最近更新 更多