Как мне создать таблицу диспетчеризации внутри класса в 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]));