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

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

4 ответов


множественное наследование страдает Проблема, который еще не был (согласован) решен в 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;
    }
}

для получения дополнительной информации и более глубокого понимания несколько Inhertance в PHP.

посмотреть в горизонтальное повторное использование для PHP


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

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

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

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