Трейты - trait это механизм обеспечения повторного использования кода в языках с поддержкой единого наследования. Другая возможность это стратегические классы - stratagy class. Из трейта - нельзя создать экземпляр объекта. Трейты допустимо использовать вместе с интерфейсами. С помощью трейта можно реализовать абстрактные методы интефейсов или абстрактных классов.
trait Helper {
public function str($s){
return strtoupper($s);
}
}
class HelloWorld {
use Helper;
public function __construct()
{
echo $this->str('test');
}
}
$MyHelloWorld = new HelloWorld();
Отличие interface от trait - с помощью интерфейсов с можно создать класс имеющий общие методы но с разной реализацией. С помощью трейтов создаются классыл имеющие как общие методы так и общую реализацию.
В трейтах возможно использование статических методов.
В трейтах возможен доступ к свойствам базовогог класса через $this, но это является плохой практикой.
Вместо прямого доступа свойствам базового класса в трейтах возможно использование абстрактных методов - которые предоставят требуемые свойства.
Трейты можно компоновать с другими трейтами.
Атрибуты доступа к методам и свойствам трейта можно указывать в самом трейте и изменять при вызове.
class Book extends Product{
use Loader{
Loader::dataLoad as private;
}
}