Допускается ли множественное наследование на уровне класса в PHP?
Возможно ли множественное наследование на уровне класса в PHP?
Ответы
Ответ 1
Множественное наследование страдает от проблемы Diamond, которая еще не была (согласована с тем, как быть) на PHP. Таким образом, не существует множественного наследования в PHP.
BaseClass
/\
/ \
ClassA ClassB
\ /
\/
ClassC
Если оба ClassA
и ClassB
определили свой собственный метод foo()
, который вы бы назвали в ClassC
?
Вам рекомендуется использовать композицию объекта или interfaces (которые допускают множественное наследование) или - если вы после повторного использования по горизонтали - посмотрите Decorator или Strategy, пока у нас не будет Черты (или Grafts или что бы они там ни назывались).
Некоторая ссылка:
Ответ 2
PHP не поддерживает множественное наследование.
Ответ 3
Вы можете имитировать его с помощью делегирования методов и свойств, но он не будет работать с 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);
}
}
Ответ 4
Нет, классы PHP могут наследовать только один класс, а не несколько.
Ответ 5
PHP не поддерживает множественное наследование как таковое, но он обеспечивает некоторую легкость повторного использования наборов методов в нескольких независимых классах, используя traits
. 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.
Посмотрите Горизонтальное повторное использование для PHP
Ответ 6
PHP не поддерживает множественное наследование для классов.