Трейты нужны для уменьшения дублирования кода. Причем выносить в них стоит только тупой код, который не имеет смысла покрывать тестами. Все что делает хоть что нибудь умное в трейте хранить не стоит.
Пример когда трейты хороши - паттерн композиция.
interface A {
function foo();
}
interface B {
function bar();
}
trait AImpl {
function foo() {
return $this->a->foo();
}
}
trait BImpl {
function bar() {
return $this->b->bar();
}
}
class AB implements A, B {
private $a;
private $b;
use AImpl;
use BImpl;
public function __construct(A $a, B $b) {
$this->a = $a;
$this->b = $b;
}
}