Разрешено ли множественное наследование на уровне класса в PHP?
Множественное наследование страдает от Алмазная проблема, которая еще не была решена (решена, как быть) в PHP. Таким образом, в PHP нет множественного наследования.
BaseClass
/\
/ \
ClassA ClassB
\ /
\/
ClassC
Если оба ClassA
а также ClassB
определили свой метод foo()
который бы вы назвали ClassC
?
Вам предлагается либо использовать состав объекта или же интерфейсы (которые допускают множественное наследование) или — если вы после горизонтального повторного использования — посмотрите на декоратор или же стратегия шаблон, пока мы не имеем Черты (или же Прививки или как они там будут называться).
Некоторые ссылки:
Вы можете имитировать его, используя метод и делегирование свойства, но оно не будет работать с 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);
}
}
PHP не поддерживает множественное наследование как таковое, но обеспечивает некоторую простоту повторного использования наборов методов в нескольких независимых классах, используя traits
. 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.
Заглянуть в Горизонтальное повторное использование для PHP
Нет, PHP не поддерживает множественное наследование.
Чтобы разрешить эту функцию в PHP, вы можете использовать интерфейсы или «Черты» вместо классов.
PHP 5.4.0 поставляется с чертами, которые будут выполнять ограничение множественного наследования. Подробнее о чертах можно узнать по приведенной ниже ссылке: