Подтвердить что ты не робот

PHP 5.4: почему классы могут переопределять методы признаков с другой подписью?

Мне интересно, есть ли веские причины, почему это поведение возможно в текущей реализации PHP 5.4:

trait T {
    public function test(PDO $pdo) {}
}

class C {
    use T;
    public function test(DOMDocument $dom) {}
}

Я думал, что тот факт, что класс использует признак, гарантировал, что этот класс имеет определенный интерфейс. Но здесь, если мы непреднамеренно переопределим метод признака для другой цели, мы даже не получаем уведомление о строгих стандартах, как в случае классического наследования.

Это специально разрешено? Зачем?

4b9b3361

Ответ 1

Это поведение документировано. От php.net(http://php.net/manual/en/language.oop5.traits.php):

Унаследованный элемент из базового класса переопределяется членом вставленном по значению. Порядок приоритета состоит в том, что члены из текущий класс переопределяет методы Trait, которые в свою очередь переопределяют унаследованные методы.

Нет причин для уведомлений.

Edit:

Я взглянул на более серьезную литературу, чтобы пролить свет на эту тему:). Похоже, такое поведение является частью определения признаков. Они хотят работать таким образом. Это из исследования "Черты: составные единицы поведения" (Труды Европейской конференции по объектно-ориентированному программированию):

Еще одно свойство композиции признаков состоит в том, что порядок композиции нерелевантные и, следовательно, интерпретирующие методы должны быть явно неоднозначно (см. раздел 3.5). Конфликты между методами, определенными в классы и методы, определяемые включенными признаками, разрешаются с использованием следующие два правила приоритета.

- Методы класса имеют приоритет над методами признаков.

- Методы атрибутов имеют приоритет над методами суперкласса. Это следует из свойства fl attening, в котором говорится, что методы признаков ведут себя так, как если бы они были определены в самом классе.

Вы можете прочитать больше здесь: http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf