Это не совсем статья, а скорее заметка - ответ на вопрос. Итак сам вопрос: есть два трейта с одинаковыми методами, а так же такой же метод в классе использующим этот метод. Что произойдет при попытке запуска такого скрипта..
Пример выглядит так
<?php trait A { public function abc(){ echo 'A::abc'; } } trait B { public function abc(){ echo 'B::abc'; } } class C { use A,B; public function abc(){ echo 'C::abc'; } } (new C)->abc();
И ответ в данном случае: ошибок не будет, будет вызван метод определенный в классе, т.е. скрипт выведет
C::abc
Когда мне задали этот вопрос, я покапался в своих воспоминаниях и точно помнил, что сталкивался с нечто подобным, и тогда мне нужно было все таки указывать какой метод нужно использовать.. странно, мб что-то напутал.. Но, нет, просто у меня была другая ситуация - методы были объявлены только в трейтах, а не в классе:
<?php trait A { public function abc(){ echo 'A::abc'; } } trait B { public function abc(){ echo 'B::abc'; } } class C { use A,B; } (new C)->abc();
приведет к
Fatal error: Trait method abc has not been applied, because there are collisions with other trait methods on C in [...][...] on line 15
и устраняется это именно указанием какой метод будет использоваться, вот так
<?php trait A { public function abc(){ echo 'A::abc'; } } trait B { public function abc(){ echo 'B::abc'; } } class C { use A,B { A::abc insteadof B; } } (new C)->abc();
Выведет
A::abc
Итак, в подобном случае надо помнить про приоритет вызовов:
- В случае если в классе будет объявлен метод, с таким же именем как в трейтах, то будет использоваться именно он и никаких ошибок не будет
- В случае, если в классе НЕТ такого метода, а в трейтах есть методы с одинаковыми именами, будет Fatal Error. Устранить его можно указав какой метод надо использовать с помощью ключевого слова insteadof.
Вот такая особенность.