PHP - вызывающий класс, реализующий интерфейс без знания имени класса - PullRequest
1 голос
/ 19 июля 2010

Я пытаюсь создать файл 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 ]

4 голосов
/ 19 июля 2010

Интерфейсы со статическими методами не имеют никакого смысла, потому что для вызова статического метода вам (как правило) нужно знать имя класса.

Вместо этого вы должны сделать метод нестатичным и создатьэкземпляр 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');

В этом примере используется шаблон проектирования Inpendency Injection .

2 голосов
/ 19 июля 2010

Интерфейс не имеет реализации метода.Он определяет только открытый API, который должны реализовывать классы.Как они это реализуют, зависит от конкретных классов.Таким образом, вы не можете вызывать методы интерфейса напрямую, потому что нет кода для вызова.Вы должны вызвать метод для реализующего класса.

Посмотрите Руководство по PHP по интерфейсам .

1 голос
/ 19 июля 2010

Нет, вы не можете этого сделать.Здесь есть несколько неправильных вещей

  • Вот как работает наследование.Цепочка методов идет вверх иерархия классов, теперь вниз.
  • Статические методы подключены к классу .Если вы переопределяете статический метод в подклассе и хотите вызвать версию подкласса, вы должны явно ссылаться на подкласс.
  • Интерфейсы не имеют реализации.Даже если язык разрешает тип звонка, который вы делаете, ничего не произойдет.AJAXDispatcher::dispatch() не имеет тела.

Вам придется переосмыслить свою стратегию здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...