Столкновения с другими методами

Как я могу иметь дело с чертами с методами одного и того же имени?

trait FooTrait { public function fooMethod() { return 'foo method'; } public function getRow() { return 'foo row'; } } trait TooTrait { public function tooMethod() { return 'too method'; } public function getRow() { return 'too row'; } } class Boo { use FooTrait; use TooTrait; public function booMethod() { return $this->fooMethod(); } } 

ошибка,

Неустранимая ошибка: метод trait getRow не применялся, потому что в Boo возникают столкновения с другими методами trait …

Что мне с этим делать?

А также, с двумя одинаковыми именами методов, как я могу получить метод из trait FooTrait ?

 $a = new Boo; var_dump($a->getRow()); // Fatal error: Call to undefined method Boo::getRow() in... 

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

 class Boo { use FooTrait, TooTrait { FooTrait::getRow insteadof TooTrait; } public function booMethod() { return $this->fooMethod(); } } 

Что делать, если я хочу получить метод getRow из TooTrait через Boo ? Является ли это возможным?

PHP Документация о конфликтах:

Если две черты вставляют метод с тем же именем, возникает фатальная ошибка, если конфликт явно не разрешен.

Чтобы разрешить конфликты имен между чертами, используемыми в одном и том же классе, оператор вместо if должен использоваться для выбора одного из конфликтующих методов.

Поскольку это позволяет только исключить методы, оператор as может использоваться для включения одного из конфликтующих методов под другим именем.

Пример № 5 Разрешение конфликтов

В этом примере Talker использует черты A и B. Поскольку A и B имеют конфликтующие методы, он определяет использование варианта smallTalk из признака B, а вариант bigTalk – из признака A.

Aliased_Talker использует оператор as, чтобы иметь возможность использовать реализацию BigTalk B в дополнительном разговоре с псевдонимами.

  <?php 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; } } 

Так что в вашем случае это может быть

 class Boo { use FooTrait, TooTrait { FooTrait::getRow insteadof TooTrait; } public function booMethod() { return $this->fooMethod(); } } 

( он работает, даже если вы делаете раздельное use , но я думаю, что это более понятно )

Или используйте, чтобы объявить псевдоним.