PHP - 作为助手的特质

时间:2012-07-11 05:48:17

标签: php traits

使用traits注入这样的辅助方法是否有任何矛盾?

   class Foo
   {

       use Helper\Array;

       function isFooValid(array $foo)
       {
            return $this->arrayContainsOnly('BarClass', $foo);
       }

   }

3 个答案:

答案 0 :(得分:6)

这就是特征的想法。

但是你仍然应该留意耦合代码。如果Helper\ArrayFoo所在的名称空间完全不同,您可能需要重新考虑这种特定方法。

答案 1 :(得分:3)

PHP中添加了

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的接口只是一种抽象工具,而特征只是一种实现工具,我认为建筑和语言无关的“接口”并不是特殊的意义。 接口在实现之前进行。依赖于抽象/接口而不是具体/细节。 因此,重要的是要记住,特征不构建应用程序体系结构,不再引发类合同,而是支持它们并为它们服务。