像这样使用特征注入辅助方法有什么矛盾吗?
Foo 类 { 使用助手\数组; 函数 isFooValid(数组 $foo) { 返回 $this->arrayContainsOnly('BarClass', $foo); } }
这就是带有特征的想法。
但是,您仍然应该留意耦合代码。如果Helper\Array
是一个完全不同的命名空间Foo
,您可能需要重新考虑这种特殊方法。
特性被添加到 PHP 中的原因很简单:PHP 不支持多重继承。简而言之,一个类一次不能扩展超过一个类。当您需要在两个不同的类中声明的功能也被其他类使用时,这变得很费力,结果是您必须重复代码才能完成工作,而不会让自己陷入蜘蛛网的迷雾中。
输入特征。这些允许我们声明一种包含可重用方法的类。更好的是,它们的方法可以直接注入到您使用的任何类中,并且您可以在同一个类中使用多个特征。让我们看一个简单的 Hello World 示例。
<?php
trait SayHello
{
private function hello()
{
return "Hello ";
}
private function world()
{
return "World";
}
}
trait Talk
{
private function speak()
{
echo $this->hello() . $this->world();
}
}
class HelloWorld
{
use SayHello;
use Talk;
public function __construct()
{
$this->speak();
}
}
$message = new HelloWorld(); // returns "Hello World";
在我看来,在谈论应用程序内的凝聚力时,分配职责是一件好事,但分散职责实际上是与合同设计无关的另一件事。这是我对作为助手的特质的关注。我一直在思考架构中的特征,我真的认为特征应该被视为它们的本质:共享实现意味着共享封装. 所以他们不应该取代接口,而应该留在他们后面。鉴于 PHP 特定的接口只是一个抽象工具,而特性只是一个实现工具,我在架构和语言不可知的意义上采用“接口”而不是特殊意义上的“接口”。接口先于实现。依赖抽象/接口而不是具体/细节。因此,重要的是要记住,特征不再构建应用程序架构,它们启动类契约,而是支持它们并为它们服务。