【问题标题】:What is the use of aware/capable interfaces in php?php中感知/功能接口的用途是什么?
【发布时间】:2017-06-01 13:38:30
【问题描述】:

我在 Symfony 和其他项目中看到了这些接口。通常它们只包含一个 setter 和一个 getter,并且它们实现的类必须实现接口中的方法。

我在这里看不到附加值。为什么不简单地添加方法而不是拥有 4-5 个实现,因为您想向现有类添加可感知且功能强大的接口。

是的,您可能很容易看到一个类能够做什么,但您也可以根据方法看到这一点,它为您提供了更多接口(在我看来)并没有真正添加一些东西。

有人可以向我解释为什么人们在 PHP 中使用这些吗?我知道他们可能在 Java 中占有一席之地(我认为它起源于 Spring?)。但我没有看到这里的价值。

【问题讨论】:

  • 这听起来像是在问接口的一般价值是什么。
  • @Carcigenicate 针对接口的类型提示以及与具体实现的可重用性/解耦是完全不同的。我在通用接口中看到了价值。我看不到连接 4-5 个接口来构建一个类的价值。
  • 我只是想澄清一下。我不知道“感知”或“有能力”的接口应该代表什么,但是当你说“为什么不简单地添加方法......”时,这听起来像是有人反对使用一般的接口。 Nvm 如果不是这样的话。
  • 接口很有用,与所使用的语言无关。我们无法真正告诉您拥有这么多接口是否有用,因为这取决于您拥有的架构、项目的规模及其可维护性目标

标签: php symfony interface


【解决方案1】:

在 Symfony 框架的情况下,ContainerAwareInterface 用于将一个类“标记”为需要容器。特别是,控制器可以选择实现接口。

发生的情况是,当请求处理程序实例化控制器时,如果控制器实现了接口,则容器被注入。可能有点小技巧,但在实践中,使用接口专门处理某些类组效果很好。请务必记录下来。

我还应该指出,更高版本的框架提供了一个 ContainerAwareTrait,它消除了实际实现 setContainer 方法的需要。

【讨论】:

    【解决方案2】:

    尝试将接口视为描述您的类的蓝图。

    我们使用接口的主要原因是它提供了交换实现的能力。

    当一个类实现一个接口时,它签署了一个合同,它必须提供这些在你的接口中定义的方法。假设有两个类实现了这个特定的接口。现在他们签署了一份合同,他们将提供这些方法。到目前为止,一切都很好。现在您可能经常听到的一个术语是接口编程。如果 2 个类实现了一个契约,我们可以随意交换它们。考虑下面的例子。

    interface CarInterface
    {
        public function hasName();
        public function hasEngine();
        public function accelerate();
    }
    
    class toyota{
        public function hasName(){
        //implementation
        }
    
        public function hasEngine(){
        //implementation
        }
    
        public function accelerate(){
        //implementation
        }
    }
    
    class opel{
        public function hasName(){
        //implementation
        }
    
        public function hasEngine(){
        //implementation
        }
    
        public function accelerate(){
        //implementation
        }
    }
    

    现在我们可以有一个需要汽车的班级。

    class circuit{
    
    protected $car;
    
    public function __construct(CarInterface $car)
        {
            $this->car=$car;
        }
    
    public function startRace(){
        $this->car->accelerate();
    }
    
    
    }
    

    好的,我们准备好了。想象一下,我们必须建立班级电路。我们必须将一个对象传递给那个新实例,但是哪个对象?实现接口的任何对象。因为我们对它进行了类型转换,所以我们编写了一个接口而不是一个具体的实现。

    $circuit = new circuit(new toyota);
    $circuit->startRace();
    

    稍后我们需要更改它,因为我们需要一个电路来运行我们的欧宝汽车。没问题。

    $circuit = new circuit(new opel);
    $circuit->startRace();
    

    我们可以随意交换实现,因为我们编写了一个接口。这是主要的好处。请阅读我在这里谈论的主题,很难理解这些概念,但一旦你开始使用它们,你就会一直使用它们。希望现在更清楚一点。

    【讨论】:

    • 这与一般的接口无关。它更多的是关于组合与继承,以及为什么有人会实现多个接口而不是单个接口。
    • 另外,它与问题无关。
    猜你喜欢
    • 2011-05-21
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2016-08-21
    • 2012-07-13
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多