使用traits注入这样的辅助方法是否有任何矛盾?
class Foo { use Helper\Array; function isFooValid(array $foo) { return $this->arrayContainsOnly('BarClass', $foo); } }
答案 0 :(得分:6)
这就是特征的想法。
但是你仍然应该留意耦合代码。如果Helper\Array
与Foo
所在的名称空间完全不同,您可能需要重新考虑这种特定方法。
答案 1 :(得分:3)
Traits ,原因很简单:PHP不支持多重继承。简而言之,课程不能一次扩展到课堂上。当你需要在其他类使用的两个不同的类中声明的功能时,这变得很费力,结果是你必须重复代码才能完成工作,而不会把自己缠在蜘蛛网的迷雾中。 / p>
输入特征。这些允许我们声明一种包含可以重用的方法的类。更好的是,他们的方法可以直接注入你使用的任何类,你可以在同一个类中使用多个特征。让我们看一个简单的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";
答案 2 :(得分:1)
在我看来,谈论应用程序中的凝聚力,分配责任是一件好事,但分散责任实际上是与合同设计无关的其他东西。 这是我对作为助手的特征的关注。 我一直在思考一个架构中的特征位置,我真的认为应该采用它们的特征:共享实现意味着共享封装。 所以他们不应该替换接口,而应该留在他们身后。 考虑到特定于PHP的接口只是一种抽象工具,而特征只是一种实现工具,我认为建筑和语言无关的“接口”并不是特殊的意义。 接口在实现之前进行。依赖于抽象/接口而不是具体/细节。 因此,重要的是要记住,特征不构建应用程序体系结构,不再引发类合同,而是支持它们并为它们服务。