Как создать таблицу диспетчеризации внутри класса в PHP? - PullRequest
2 голосов
/ 20 ноября 2008

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

$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]));

В результате Сообщение: 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 ]

8 голосов
/ 20 ноября 2008

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

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

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

$method = $this->dispatch[1];
$this->$method();
5 голосов
/ 20 ноября 2008

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

$this->dispatch = array('somemethod', 'anothermethod');
...
call_user_func(array($this,$this->dispatch[1]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...