Трейты | trait

Трейты - 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;
	}
}