oop — разрешено ли множественное наследование на уровне класса в PHP?

Разрешено ли множественное наследование на уровне класса в PHP?

14

Решение

Множественное наследование страдает от Алмазная проблема, которая еще не была решена (решена, как быть) в PHP. Таким образом, в PHP нет множественного наследования.

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

Если оба ClassA а также ClassB определили свой метод foo()который бы вы назвали ClassC?

Вам предлагается либо использовать состав объекта или же интерфейсы (которые допускают множественное наследование) или — если вы после горизонтального повторного использования — посмотрите на декоратор или же стратегия шаблон, пока мы не имеем Черты (или же Прививки или как они там будут называться).

Некоторые ссылки:

37

Другие решения

Вы можете имитировать его, используя метод и делегирование свойства, но оно не будет работать с 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);
}
}
3

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

2

Нет, PHP не поддерживает множественное наследование.

Чтобы разрешить эту функцию в PHP, вы можете использовать интерфейсы или «Черты» вместо классов.

PHP 5.4.0 поставляется с чертами, которые будут выполнять ограничение множественного наследования. Подробнее о чертах можно узнать по приведенной ниже ссылке:

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

1
По вопросам рекламы [email protected]