我在Symfony和其他项目中看到了这些接口。通常它们只包含一个setter和一个getter,它们实现的类必须从接口实现该方法。
虽然我没有看到附加价值。为什么不简单地添加方法而不是4-5实现,因为您想要为现有类添加有意识且有能力的接口。
是的,您可能很容易看到一个类能够做什么,但您也可以根据这些方法看到它,并且它为您提供了更多的接口(在我看来)并没有真正添加内容。
有人可以向我解释为什么人们在PHP中使用它们吗?我知道他们可能在Java中占有一席之地(我认为它来自Spring?)。但我没有看到这里的价值。
答案 0 :(得分:2)
在Symfony框架的情况下,ContainerAwareInterface用于"标记"需要容器的类。特别是,控制器可以选择性地实现接口。
当请求处理程序实例化控制器时,如果控制器实现接口,则注入容器。或许在实践中,使用接口来专门处理某些类的组很有效。请务必记录。
我还应该指出,框架的更高版本提供了一个ContainerAwareTrait,它不需要实际实现setContainer方法。
答案 1 :(得分:-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();
我们可以随意交换实现,因为我们编程了一个接口。这是主要的好处。请阅读我在这里谈论的主题,很难围绕这个概念,但一旦你这样做,你一直使用它们。希望现在有点清楚。