我正在尝试创建一个调用另一个文件中的函数的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 ....
任何人都知道我做错了什么?
答案 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。它们如何实现它取决于具体的类。因此,您无法直接调用接口的方法,因为没有要调用的代码。你必须在实现类上调用该方法。
答案 2 :(得分:1)
不,你不能这样做。这里有几个问题
AJAXDispatcher::dispatch()
没有身体。你将不得不在这里重新考虑你的策略。