Допускается ли множественное наследование на уровне класса в 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 не поддерживает множественное наследование для классов.