关于oop:PHP中的类级允许多重继承吗?

Is Multiple Inheritance allowed at class level in PHP?

PHP中是否允许在类级别上进行多重继承?


多重继承受到菱形问题的困扰,这个问题还没有在PHP中得到解决(商定如何解决)。因此,PHP中没有多重继承。

1
2
3
4
5
6
7
    BaseClass
       /\
      /  \
 ClassA  ClassB
      \  /
       \/
     ClassC

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

我们鼓励您使用对象组合或接口(允许多重继承),或者-如果您是在水平重用之后-查看装饰器或策略模式,直到我们有了特征(或者嫁接,或者他们将被称为什么)。

一些参考:

  • [php-dev]性状,嫁接,水平重复利用
  • [php-dev]多类继承
  • RFC:PHP的特性
  • 像现在在PHP中的功能这样的特性
  • 小精灵


    您可以使用方法和属性委托来模拟它,但它不适用于is_a()instanceof

    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不支持多重继承,但是它确实提供了一些使用traits在多个独立类中重用方法集的便利。trait与类一样被编写,但它不能被自己实例化。

    下面是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