2013-05-24 2 views
33

Как я могу назвать обычную (не статическую) функцию класса по ее имени?php call class function по имени строки

Приведенный ниже приведен пример ошибки, указывающей, что параметр 1 должен быть действительным обратным вызовом. Я не хочу, чтобы функция была статической, я хочу, чтобы она была нормальной функцией, и все примеры, которые я видел до сих пор, были статическими.

class Player 
{ 
    public function SayHi() { print("Hi"); } 
} 

$player = new Player(); 

call_user_func($Player, 'SayHi'); 
+0

прочитать пример 4 по их документации: http://php.net/manual/en/function .call-user-func.php – Matthew

+0

Интересно, что он не жалуется на это дело. Вы объявляете «игрока», но называете «Player», с капиталом «P». –

+0

@ drale2k: It * есть * жалуется. «param 1 должен быть действительным обратным вызовом» –

ответ

68

callback синтаксис немного странным в PHP. Вам нужно сделать массив. Первый элемент - это объект, а второй - метод.

call_user_func(array($player, 'SayHi')); 

Вы также можете сделать это без call_user_func:

$player->{'SayHi'}(); 

Или:

$method = 'SayHi'; 
$player->$method(); 
+0

Awesome thanks! –

7

Вам нужно передать объект и метод вместе как массив:

call_user_func(array($Player, 'SayHi')); 

См callbacks, а именно:

// Type 3: Object method call 
$obj = new MyClass(); 
call_user_func(array($obj, 'myCallbackMethod')); 
-8

$player->SayHi();

Я предпочитаю эту форму.

+4

И все же это не дает отдаленного ответа на вопрос. -1 –

+4

Дело в том, что '' SayHi'' является строкой. –

+1

Вы имели в виду '$ player -> $ SayHi()'? – greenoldman

0

Вы все равно создаете объект класса, поэтому вы можете использовать объект для вызова его функции.

$player = new Player(); 
$player->SayHi(); 

или использование обратного вызова

$player = new Player(); 
call_user_func(array($player, 'SayHi')); 
+1

Это был просто пример. Мне нужно сохранить объекты и их функции как обратные вызовы, которые будут запущены из другой системы, но я не хотел вводить этот код. – user441521

+0

см. Мой отредактированный ответ – Nagarjun