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

2022-08-30 22:47:03

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


答案 1

多重继承受到钻石问题的困扰,这个问题尚未在PHP中得到解决(就如何解决达成一致)。因此,PHP 中没有多重继承

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

如果两者都定义了自己的方法,你会调用哪一个?ClassAClassBfoo()ClassC

我们鼓励您使用对象组合接口(允许多重继承),或者 - 如果您追求水平重用 - 查看装饰器策略模式,直到我们有特征(或嫁接或其他任何它们将被称为)。

一些参考:


答案 2

PHP本身不支持多重继承,但它确实提供了一些使用特征在多个独立类中重用方法集的便利性。A 的编写方式与类类似,但它不能由其自身实例化。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 中多重 Inhertance 的更多信息和更深入的了解。

研究 PHP 的水平重用


推荐