简单来说,由于 Traits 的工作方式如此,所以真正的短版本会更简单。
在 PHP 中写 use SomeTrait;
就像(实际上)告诉编译器将 Trait 中的代码复制并粘贴到正在使用它的类中。
因为 use SomeTrait;
在类内部,所以它无法向类添加 implements SomeInterface
,因为这必须在类外面。
"为什么 Traits 不是 PHP 中的类型? "
因为它们无法被实例化。Traits 只是一个语言结构(告诉编译器将该 trait 代码复制并粘贴到这个类中), 而不是您的代码可以引用的对象或类型。
所以,我想在代码中“设计”每个想要使用我的 Trait 的类都必须实现接口。
可以使用抽象类强制执行这一点,通过在其中使用 trait 并从其中扩展类。
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。
或者,你的逻辑可能有误。应该要求实现接口的类具有特定函数,而不是如果它们具有特定函数,则必须声明自己实现了一个接口。
编辑
实际上,你可以在Trait内定义抽象函数以强制类实现该方法。例如:
trait LoggerTrait {
public function debug($message, array $context = array()) {
$this->log('debug', $message, $context);
}
abstract public function log($level, $message, array $context = array());
}
然而,这仍然不允许您在trait中实现接口,并且仍然像是一个糟糕的设计,因为接口比trait更好地定义了类需要满足的合同。