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

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

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

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

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

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

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

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

Редактировать:

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

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

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

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

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