Трейты - механизм повторного использования кода без наследования (горизонтальное переиспользование):
trait Timestampable {
public ?DateTime $createdAt = null;
public function setCreatedAt(): void {
$this->createdAt = new DateTime();
}
}
trait SoftDeletable {
public ?DateTime $deletedAt = null;
public function softDelete(): void {
$this->deletedAt = new DateTime();
}
}
class User {
use Timestampable, SoftDeletable;
}Трейты не нарушают SOLID если используются для переиспользования инфраструктурного кода. Проблемы: неявные зависимости, конфликты имен, сложность отладки.