真正简短的版本比较简单,因为您做不到。这不是特质的工作方式。
use SomeTrait;
用PHP编写时,(有效地)告诉编译器将代码从Trait复制并粘贴到使用该代码的类中。
由于处于use SomeTrait;
类内部,因此不能将其添加implements SomeInterface
到类中,因为该类必须位于类外部。
“为什么PHP中没有Traits类型?”
因为它们无法实例化。特性实际上只是一种语言构造(告诉编译器将特征代码复制并粘贴到此类中),而不是您的代码可以引用的对象或类型。
因此,我想在代码中“设计”每个想要使用我的特征的类都必须实现接口。
可以使用抽象类对use
特征进行强制,然后从其扩展类来实施该操作。
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();
但是,如果确实需要强制使用Trait的任何类都具有特定方法,那么我认为您可能正在使用traits,而本来应该是抽象类。
还是您的逻辑有误。您的意思是要求实现接口的类具有某些功能,而不是要求它们具有某些必须将自身声明为实现接口的功能。
编辑
实际上,您可以在Traits中定义抽象函数,以强制类实现该方法。例如
trait LoggerTrait {
public function debug($message, array $context = array()) {
$this->log('debug', $message, $context);
}
abstract public function log($level, $message, array $context = array());
}
但是,这仍然不允许您在特征中实现接口,并且仍然闻起来像是糟糕的设计,因为在定义类需要履行的契约方面,接口比特征好得多。