php中有意识/有能力的界面有什么用?

时间:2017-01-17 13:06:27

标签: php symfony interface

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

虽然我没有看到附加价值。为什么不简单地添加方法而不是4-5实现,因为您想要为现有类添加有意识且有能力的接口。

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

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

2 个答案:

答案 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();

我们可以随意交换实现,因为我们编程了一个接口。这是主要的好处。请阅读我在这里谈论的主题,很难围绕这个概念,但一旦你这样做,你一直使用它们。希望现在有点清楚。