Допускается ли множественное наследование на уровне класса в PHP?
Множественное наследование страдает от проблемы Diamond , которая еще не была (согласована с тем, как быть) на PHP. Таким образом, в PHP нет множественного наследования .
BaseClass /\ / \ ClassA ClassB \ / \/ ClassC
Если и ClassA
и ClassB
определили свой собственный метод foo()
, который вы бы назвали в ClassC
?
Вам рекомендуется либо использовать композицию объекта или интерфейсы (которые допускают множественное наследование), либо – если вы после горизонтального повторного использования – посмотрите на образец Decorator или Strategy , пока у нас не появятся Черты (или Графики или что бы они там ни назывались).
Некоторые ссылки:
PHP не поддерживает множественное наследование.
Вы можете имитировать его с помощью делегирования методов и свойств, но он не будет работать с is_a()
или instanceof
:
class A extends B { public function __construct($otherParent) { $this->otherParent = $otherParent; } public function __call($method, $args) { $method = array($this->otherParent, $method); return call_user_func_array($method, $args); } }
Нет, классы PHP могут наследовать только один класс, а не несколько.
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 не поддерживает множественное наследование для классов.