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

bco*_*lan 2 php inheritance

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

接口代码:

interface AJAXDispatcher {
    static function dispatch($action);
}
Run Code Online (Sandbox Code Playgroud)

执行:

class myAJAX implements AJAXDispatcher {

static function dispatch($action) {
    if ($action === "action1") {
        do_something();
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎没问题。我尝试通过首先导入它所在的文件来调用它。我试图使其独立于类的名称,以便我可以执行如下操作:

AJAXDispatcher::dispatch($action);
Run Code Online (Sandbox Code Playgroud)

认为这会起作用,因为 myAJAX 将从 AJAXDispatcher 继承,但我收到以下错误:

Fatal error: Cannot call abstract method AJAXDispatcher::dispatch() in ....
Run Code Online (Sandbox Code Playgroud)

有人知道我做错了什么吗?

igo*_*orw 5

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

相反,您应该使该方法成为非静态的并在某处创建 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');
Run Code Online (Sandbox Code Playgroud)

此示例使用依赖注入设计模式。