Так как PHP не поддерживает множественное наследование, то для обхода этого ограничения можно использовать Трейты. Трейты — это группировка функционала — методов и свойств, для дальнейшего использования в различных классах.
Для того чтобы получить доступ к методам и свойствам трейта используется ключевое слово «use«.
Если используется несколько трейтов, и трейты содержат метод с одинаковым названием, то для разрешения этого конфликта используется используется оператор «insteadof «, благодаря которому явно указывается трейт, у которого будет браться метод.
Пример:
<?
trait WishOne
{
public function sayYourWish()
{
return 'Mom, i want to walk';
}
}
trait WishTwo
{
public function sayYourWish()
{
return 'Mom i dont want to walk';
}
}
class GetWish
{
use WishOne,WishTwo
{
WishOne::sayYourWish insteadof WishTwo;
// WishTwo::sayYourWish insteadof WishOne;
}
public function tellMe()
{
echo $this->sayYourWish();
}
}
$obj = new GetWish();
$obj->tellMe(); // Mom, i want to walk
WishOne::sayYourWish insteadof WishTwo; — данная строка кода Нам говорит о том, что метод sayYourWish() необходимо брать из трейта WishOne, а не из трейта WishTwo.
После выполнения скрипта, на экране получим — «Mom, i want to walk»
Еще несколько слов о трейтах, которые желательно знать:
- Методы текущего класса переопределяют методы трейта.
- Методы трейта переопределяют унаследованные классом методы.
- Невозможно создать экземпляр трейта.