Тема: Трейты PHP

1 2 3 4

Трейты - определение
Трейты используются когда нужно реализовать ряд общих методов для нескольких классов, не присваивая экземплярам класса новый тип, как при использовании абстрактных классов или интерфейсов.
Трейты решают проблему дублирования кода.
Трейты очень похожи на классы. Реализовываются трейты с помощью ключевого слова trait. За ним указывается имя трейта, а потом в фигурных скобках указывается тело трейта, то есть методы и свойства, которые вы считаете нужным поместить в него. После объявления трейта его можно использовать при создании собственных классов. Для этого используется ключевое слово use.
Невозможно создать самостоятельный экземпляр трейта.
Трейты не присваивают экземплярам класса (объектам) новый тип.
Пример использования:
<?php
trait someTrait {
public function doStuff(){
echo "Метод doStuff трейта someTrait";
}
}
class someClass {
use someTrait;
}
someClass::doStuff();

Пример:
<?php
interface someInterface {
public function doStuff();
}
trait someTrait {
public function doStuff(){
echo "Метод doStuff трейта someTrait";
}
}
class someClass implements someInterface {
use someTrait;
}
$object = new someClass();

if ($object  instanceof  someInterface)  echo "Объект соответствует типу someInterface.<br>";
else  echo "Объект не соответствует типу someInterface.<br>";
if ($object  instanceof  someTrait)  echo "Объект соответствует типу someTrait.<br>";
else  echo "Объект не соответствует типу someTrait.<br>";

Использование нескольких трейтов
При необходимости можно использовать несколько трейтов при создании одного класса. Для этого имена трейтов нужно перечислить через запяту после слова use.

<?php
trait someTrait {
public function doStuff(){
echo "Метод doStuff трейта someTrait.";
}
}
trait otherTrait {
public function doOtherStuff(){
echo "Метод doOtherStuff трейта otherTrait.";
}
}
class someClass {
use someTrait, otherTrait;
}
someClass::doOtherStuff();
Совместное использование трейтов и интерфейсов
Итак, мы уже знаем что трейты не присваивают новый тип данных. Но этот общий тип данных может понадобиться. Эта задача решается совместным использованием трейтов и интерфейсов. Мы сначала определяем интерфейс с сигнатурой метода someMethod, а затем в трейте описываем этот метод. При создании класса мы реализуем интерфейс просто подключая к нему трейт, в котором описан нужный метод.

<?php
interface someInterface {
public function someMethod();
}
trait someTrait {
public function someMethod(){
echo "Метод someMethod трейта someTrait.";
}
}
class someClass implements someInterface{
use someTrait;
}
someClass::someMethod();

Импортируемый из трейта метод удовлетворяет требования реализуемого интерфейса, а значит теперь мы можем проверять объекты класса при помощи оператора instanceof.
1 2 3 4

Другие темы: