PHP - 在不知道类名的情况下实现接口的调用类

时间:2010-07-19 13:48:13

标签: php inheritance

我正在尝试创建一个调用另一个文件中的函数的PHP文件。一些示例代码:

接口代码:

interface AJAXDispatcher {
    static function dispatch($action);
}

实现:

class myAJAX implements AJAXDispatcher {

static function dispatch($action) {
    if ($action === "action1") {
        do_something();
}

这对我来说似乎没问题。我试着通过首先导入它所在的文件来调用它。我试图让它独立于类的名称,这样我就可以这样做:

AJAXDispatcher::dispatch($action);

认为这可行,因为myAJAX将继承自AJAXDispatcher,但我收到以下错误:

Fatal error: Cannot call abstract method AJAXDispatcher::dispatch() in ....

任何人都知道我做错了什么?

3 个答案:

答案 0 :(得分:4)

使用静态方法的接口没有任何意义,因为要调用静态方法(通常)需要知道类名。

相反,您应该使该方法非静态并在某处创建myAJAX的实例。调用AJAXDispatcher的代码接收实例并调用它。您可以使用类型提示来确保获得正确的实例。

interface AJAXDispatcher {
  public function dispatch($action);
}

class myAJAX implements AJAXDispatcher {
  public function dispatch($action) {
    do_something();
  }
}

class Controller {
  private $dispatcher;

  public function __construct(AJAXDispatcher $dispatcher) {
    $this->dispatcher = $dispatcher;
  }

  public function action($action) {
    $this->dispatcher->dispatch($action);
  }
}

$dispatcher = new myAJAX();

$controller = new Controller($dispatcher);
$controller->action('index');

此示例使用Dependency Injection设计模式。

答案 1 :(得分:2)

接口没有方法实现。它只定义了类必须实现的公共API。它们如何实现它取决于具体的类。因此,您无法直接调用接口的方法,因为没有要调用的代码。你必须在实现类上调用该方法。

查看PHP Manual on Interfaces

答案 2 :(得分:1)

不,你不能这样做。这里有几个问题

  • 现在,继承是如何运作的。方法链接 up 类层次结构,现在已经关闭。
  • 静态方法已连接到。如果覆盖子类中的静态方法,并且想要调用子类的版本,则必须显式引用子类。
  • 接口没有实现。即使语言允许您正在进行的呼叫类型,也不会发生任何事情。 AJAXDispatcher::dispatch()没有身体。

你将不得不在这里重新考虑你的策略。