La versión realmente corta es más simple porque no puedes. No es así como funcionan los rasgos.
Cuando escribe use SomeTrait;
en PHP, le está diciendo (efectivamente) al compilador que copie y pegue el código del Trait en la clase donde se está utilizando.
Debido a que use SomeTrait;
está dentro de la clase, no se puede agregar implements SomeInterface
a la clase, porque tiene que estar fuera de la clase.
"¿Por qué no hay tipos de rasgos en PHP?"
Porque no se pueden crear instancias. Los rasgos son en realidad solo una construcción del lenguaje (que le dice al compilador que copie y pegue el código del rasgo en esta clase) en lugar de un objeto o tipo al que su código puede hacer referencia.
Entonces, quiero "diseñar" en el código que cada clase que quiera usar mi rasgo tenga que implementar la interfaz.
Eso se puede hacer cumplir usando una clase abstracta para use
el rasgo y luego extendiendo clases desde él.
interface SomeInterface{
public function someInterfaceFunction();
}
trait SomeTrait {
function sayHello(){
echo "Hello my secret is ".static::$secret;
}
}
abstract class AbstractClass implements SomeInterface{
use SomeTrait;
}
class TestClass extends AbstractClass {
static public $secret = 12345;
}
$test = new TestClass();
$test->sayHello();
Sin embargo, si necesita hacer cumplir que cualquier clase que use un Rasgo tiene un método en particular, creo que puede estar usando rasgos donde debería haber sido clases abstractas en primer lugar.
O que tienes tu lógica al revés. Debe requerir que las clases que implementen interfaces tengan ciertas funciones, no que si tienen ciertas funciones deban declararse como implementadoras de una interfaz.
Editar
En realidad, puede definir funciones abstractas dentro de Traits para forzar a una clase a implementar el método. p.ej
trait LoggerTrait {
public function debug($message, array $context = array()) {
$this->log('debug', $message, $context);
}
abstract public function log($level, $message, array $context = array());
}
Sin embargo, esto todavía no le permite implementar la interfaz en el rasgo, y aún huele como un mal diseño, ya que las interfaces son mucho mejores que los rasgos para definir un contrato que una clase debe cumplir.