No estoy ni a favor ni en contra.Prefiero herencia múltiple, porque es OOP. Traits no lo es.Es un paradigma distinto, y acabará mezclado.
Mira este código:
Código PHP:
Ver originaltrait muylisto {
public function sayHello() {
$this->myHello();
}
}
class prueba
{
use muylisto;
private function myHello()
{
echo "HOLA";
}
}
$c=new prueba();
$c->sayHello();
El trait "muylisto" está presuponiendo que la clase en la que se use, va a existir la función "myHello".
Ese código es perfectamente válido, y anti-OOP.
El equivalente es como si una clase base supiera a priori en qué clase va a ser usado (sin necesitar implementar un interfaz, o declarar el método como abstracto, o forzar de alguna forma a quien lo vaya a usar).
Puedes decir "bueno, sólo hay que tener cuidado, claro"...Pero, si siempre se tuviera cuidado, no haría falta ni "private","protected",etc,etc
Supongamos que la clase que usa el trait, no implementa la función.En qué momento se detectaría el problema? Cuando se ejecute el código.
En qué momento se detecta el problema de que una clase derivada no implementa un interfaz? En tiempo de parseo (a lo más que puede aspirar un lenguaje interpretado).Es una gran diferencia.