PHP — что такое трейты?
Трейт — это способ использовать одни и те же методы в разных классах: вы пишете методы один раз, и любой класс, которому они нужны, может их подключить.
Трейт может содержать как обычные, так и абстрактные методы, и эти методы могут иметь любой модификатор доступа (public, private или protected).
Поэтому трейты служат инструментом повторного использования кода: несколько методов можно свободно добавлять во множество разных классов.
Объявление трейта
Начните с ключевого слова trait, а затем дайте трейту имя:
Синтаксис трейта
Базовая форма определения трейта:
<?php
trait TraitName {
// some code...
}
?>
Использование трейта
Внутри класса напишите ключевое слово use и имя трейта, чтобы подключить его.
В следующем примере есть трейт с именем message1 и класс с именем Welcome, который его использует. В результате все методы трейта становятся доступны в классе.
Совет: Любой другой класс, которому нужен msg1(), может использовать message1 таким же образом. Вы избегаете дублирования кода, поскольку один и тот же метод не приходится объявлять снова и снова.
Пример
Welcome использует трейт, поэтому его объекты могут вызывать метод трейта:
Вывод: PHP-скрипт
<?php
// Определяем трейт
trait message1 {
public function msg1() {
echo "ООП в PHP — это интересно! ";
}
}
// Используем трейт в классе
class Welcome {
use message1;
}
$obj = new Welcome();
$obj->msg1();
?>
Использование трейта в классе
Как класс подключает трейт:
<?php
class MyClass {
use TraitName;
}
?>
PHP — два класса и один трейт
Здесь один трейт, message1, содержит три публичных метода, а два класса, Welcome и Welcome2, используют его. Оба класса получают все три метода, но не обязаны вызывать их все: код вызывает только один метод у Welcome и все три у Welcome2.
Пример
Один и тот же трейт обслуживает два класса, которые вызывают разные его методы:
Вывод: PHP-скрипт
<?php
trait message1 {
public function msg1() {
echo "ООП в PHP — это интересно! ";
}
public function msg2() {
echo "Трейты уменьшают дублирование кода! ";
}
public function msg3() {
echo "Привет, мир!";
}
}
class Welcome {
use message1;
}
class Welcome2 {
use message1;
}
$obj = new Welcome();
$obj->msg1();
echo "<br>";
$obj2 = new Welcome2();
$obj2->msg1();
$obj2->msg2();
$obj2->msg3();
?>
PHP — использование нескольких трейтов
Класс не ограничен одним трейтом. В этом примере есть два трейта, message1 и message2, и два класса. Welcome использует только message1, а Welcome2 использует оба, с запятой между именами трейтов.
Пример
Welcome2 перечисляет два трейта через запятую:
Вывод: PHP-скрипт
<?php
trait message1 {
public function msg1() {
echo "ООП в PHP — это интересно! ";
}
}
trait message2 {
public function msg2() {
echo "Трейты уменьшают дублирование кода!";
}
}
class Welcome {
use message1;
}
class Welcome2 {
use message1, message2;
}
$obj = new Welcome();
$obj->msg1();
echo "<br>";
$obj2 = new Welcome2();
$obj2->msg1();
$obj2->msg2();
?>