Чат 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.

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

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


DmitryGavrilov

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

ivashkevich

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

DmitryGavrilov

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

Bogdan

ну ладно вопрос зачем тут добавили, у меня вообще возник вопрос, нафига нужен тот интерфейс?! по факту на сегодняшний урок я вижу большие плюсы в трейтах, а именно написание кучу методов и потом что б все классы черпали их. А вот нафига интерфейс, не знаю. Какой-то дополнительный файл с дублированием методов, пару лишних килобайт добавляет проекту )))

Bogdan

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

ivashkevich

Урок про интерфейсы просмотри ещё разок. Если будет непонятно - напиши в личку

Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Популярное за сутки
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Сейчас читают
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Новые статьи
Логические задачи с собеседований