PHP中的接口可以强制扩展类吗?

时间:2015-01-19 19:21:29

标签: php oop

在PHP中,我可以声明一个接口必须扩展一个类吗?如果没有,哪种设计模式最适合这种情况?

我试图在收到论据后避免使用内省。

示例场景:我想创建一种命令,但我并不关心实现。

我可以执行以下操作:

use Symfony\Component\Console\Command\Command;

interface Installer extends Command
{
}

class MyCommand extends Command implements Installer
{
}

class CommandConsumer
{
    public function runCommand(Installer $installer)
    {
        // do stuff
    }
}

而不是:

abstract class Installer extends Command
{
}

或者:

class CommandConsumer
{
    public function runCommand(Command $command)
    {
        if (!$command instanceof Installer)
            throw new \InvalidArgumentException('Installer needed.');
    }
}

下面的测试脚本会产生以下致命错误:

Fatal error: Calculation cannot implement ConcreteClass - it is not an interface in /Users/sbuzonas/projects/sandbox/inheritenceTest.php on line 13

Call Stack:
    0.0003     238920   1. {main}() /Users/sbuzonas/projects/sandbox/inheritenceTest.php:0

这让我相信它无法完成。

<?php

class ConcreteClass
{

    public function add($a, $b)
    {
        return $a + $b;
    }
}

interface Calculation extends ConcreteClass
{

    public function calculate(array $operations);
}

class Calculator extends ConcreteClass implements Calculation
{

    public function calculate(array $operations)
    {
        list($a, $b) = $operations;
        echo $this->add($a, $b);
    }
}

$calc = new Calculator();
$calc->calculate(array(1, 2));

1 个答案:

答案 0 :(得分:1)

您可以使用对您的用例有意义的方法创建一个接口,例如:

interface Installer {

    public function operation1();

    public function operation2();
}

使用某个库类为您完成一项具体实现:

class MyInstaller implements Installer {

    /**
     * @var \Symfony\Component\Console\Command\Command
     */
    private $command;

    public function __construct() {
        $this->command = new \Symfony\Component\Console\Command\Command();
    }

    public function operation1() {
        $this->command->analogousOperation();
    }

    public function operation2() {
        $this->command->analogousOperation();
    }

}

现在您可以在任何需要安装程序的地方使用MyInstaller,它将使用\ Symfony \ Component \ Console \ Command \ Command

进行工作

此客户端使用它时没有任何问题:

class CommandConsumer
{
    public function runCommand(Installer $installer)
    {
        // do stuff
    }
}
相关问题