Чат PHP-разработчиков
Логические задачи с собеседований
Трейты в PHP

Трейты в PHP

Как мы знаем, в PHP класс может наследоваться только от одного класса. Но как быть, если мы хотим иметь какой-либо функционал в разных классах, которые не являются наследниками друг друга? Для этого придумали трейты. Трейты в PHP – это такой механизм, который позволяет внутри классов избегать повторного использования кода.

Давайте разберём на примере. Пусть у нас будут два совершенно не связанных между собой класса: коробка и человек. Но предположим, что мы хотели бы, чтобы они оба умели говорить о том, какого они класса. Давайте для начала создадим два этих класса и прямо в них создадим методы sayYourClass(), которые будут выводить имя класса, объектами которого они являются.

Код доступен только после покупки курса ООП в PHP.

Результат:

Код доступен только после покупки курса ООП в PHP.

В PHP можно получить имя класса с помощью конструкции ИмяКласса::class. Например:

Код доступен только после покупки курса ООП в PHP.

Выведет:

Код доступен только после покупки курса ООП в PHP.

Если мы находимся внутри класса, например, в каком-то его методе, то мы можем ИмяКласса заменить словом self – текущий класс.

Код доступен только после покупки курса ООП в PHP.

Результат останется прежним.

Код доступен только после покупки курса ООП в PHP.

Как видим, в классах получились одинаковые методы, и было бы неплохо избавиться от дублирования. Вот тут нам и понадобится трейт. Описываются трейты следующим образом:

Код доступен только после покупки курса ООП в PHP.

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

Код доступен только после покупки курса ООП в PHP.

И снова увидим нужный результат:

Код доступен только после покупки курса ООП в PHP.

Код из трейта SayYourClass просто подставился в классы, где мы его использовали с помощью слова use. В self будет лежать класс, в котором сейчас исполняется этот код. Вот так всё просто.

Трейты также довольно плотно пересекаются с темой интерфейсов.

Давайте добавим интерфейс, который будет обязывать классы иметь метод sayYourClass().

Код доступен только после покупки курса ООП в PHP.

Теперь наши классы могут его реализовать – этот метод реализован в трейте, а трейт используется в классе.

Давайте посмотрим на получившийся код.

Код доступен только после покупки курса ООП в PHP.

В PHP класс может наследоваться только от одного класса, помните? Так вот с помощью интерфейсов и трейтов мы можем это ограничение немного обойти. Мы теперь можем добавлять некоторый функционал в классы, которые не имеют какого-то общего поведения в целом. Но они при этом объединены одним интерфейсом. А проверять, реализует ли объект интерфейс, мы уже умеем – с помощью конструкции instanceof.

Таким образом, мы можем обходить ограничения наследования:

  • класс реализует что-то, и мы можем быть в этом уверены (проверив на реализацию интерфейса);
  • класс может иметь несколько таких независимых друг от друга реализаций (благодаря возможности реализовать несколько интерфейсов и подключить несколько трейтов).
Читайте также
Комментарии


DmitryGavrilov
DmitryGavrilov

Добрый день! Опишите пожалуйста подробно зачем мы сюда еще добавили интерфейс, думаю у многих есть вопрос "Зачем тут интерфейс?)) И так же все работает!". Было бы чудесно добавить пример где этот добавленный интерфейс используется и без него никак. Спасибо!

ivashkevich
ivashkevich

В дальнейших уроках это будет использоваться, пока просто рассказываю о возможностях языка =)

DmitryGavrilov
DmitryGavrilov

Понял, благодарю, просто хочется сразу все знать)