Как мне создать таблицу диспетчеризации внутри класса в PHP?

Скажем, у меня есть класс с приватной таблицей отправки.

$this->dispatch = array(
    1 => $this->someFunction,
    2 => $this->anotherFunction
);

Если я тогда позвоню

$this->dispatch[1]();

Я получаю сообщение об ошибке, что метод не является строкой. Когда я делаю это как строка:

$this->dispatch = array(
    1 => '$this->someFunction'
);

Это приводит кфатальной ошибке: вызов неопределенной функции $this->someFunction()

Я также пытался использовать:

call_user_func(array(SomeClass,$this->dispatch[1]));

В результате Message: call_user_func(SomeClass::$this->someFunction) [function.call-user-func]: первый аргумент должен быть допустимым обратным вызовом.

Редактировать: я понял, что это не имеет смысла, так как он вызывает SomeClass:: $ this, когда $ this SomeClass. Я пробовал это несколькими способами, с массивом, содержащим

array($this, $disptach[1])

Это все еще не выполняет то, что мне нужно.

Конец редактирования

Это работает, если у меня нет класса и просто есть файл отправки с некоторыми функциями. Например, это работает:

$dispatch = array(
    1 => someFunction,
    2 => anotherFunction
);

Мне интересно, есть ли способ, которым я все еще могу хранить их как частные методы в классе, но все еще использовать их с таблицей диспетчеризации.

2 ответа

Решение

Вы можете сохранить имя метода в диспетчере как:

$this->dispatch = array('somemethod', 'anothermethod');

а затем используйте:

$method = $this->dispatch[1];
$this->$method();

Call_user_func*-Семейство функций должно работать так:

$this->dispatch = array('somemethod', 'anothermethod');
...
call_user_func(array($this,$this->dispatch[1]));
Другие вопросы по тегам