7

像这样使用特征注入辅助方法有什么矛盾吗?

   Foo 类
   {

       使用助手\数组;

       函数 isFooValid(数组 $foo)
       {
            返回 $this->arrayContainsOnly('BarClass', $foo);
       }

   }
4

3 回答 3

10

这就是带有特征的想法。

但是,您仍然应该留意耦合代码。如果Helper\Array是一个完全不同的命名空间Foo,您可能需要重新考虑这种特殊方法。

于 2012-07-11T06:49:31.400 回答
5

特性被添加到 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";
于 2014-07-19T16:31:00.050 回答
1

在我看来,在谈论应用程序内的凝聚力时,分配职责是一件好事,但分散职责实际上是与合同设计无关的另一件事。这是我对作为助手的特质的关注。我一直在思考架构中的特征,我真的认为特征应该被视为它们的本质:共享实现意味着共享封装. 所以他们不应该取代接口,而应该留在他们后面。鉴于 PHP 特定的接口只是一个抽象工具,而特性只是一个实现工具,我在架构和语言不可知的意义上采用“接口”而不是特殊意义上的“接口”。接口先于实现。依赖抽象/接口而不是具体/细节。因此,重要的是要记住,特征不再构建应用程序架构,它们启动类契约,而是支持它们并为它们服务。

于 2013-02-27T09:22:32.087 回答