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