2010-12-11 3 views
5

Я только что создал функцию, которая извлекает строку URI и превращает ее в массив, как показано ниже. Этот пример основан на URL из http://mydomain.com/mycontroller/mymethod/varPHP: вызов класса из массива?

Array 
(
    [0] => mycontroller 
    [1] => mymethod 
    [2] => var 
) 

Если я пишу new $myArray[0];, я буду загружать myController класс, но я могу сделать функцию, которая обрабатывает возможное существование методов и их призвание с соответствующими переменными?

ответ

8

Я не уверен, что вы подразумеваете под «ручками возможного существования методов и их призвание с соответствующими переменными», но вы можете быть после call_user_func_array:

call_user_func_array(
    array($myArray[0], $myArray[1]), 
    array($myArray[2]) 
); 

Если вы хотите, чтобы сделать это для конкретного примера, который вы создали с помощью $controller = new $myArray(0), замените $myArray[0] на $controller, например

$controller = new $myArray(0); 
call_user_func_array(
    array($controller, $myArray[1]), 
    array($myArray[2]) 
); 

или пройти new $myArray[0] если вы не заботиться о случае потери после вызова

call_user_func_array(
    array(new $myArray[0], $myArray[1]), 
    array($myArray[2]) 
); 

В противном случае вы получите уведомление E_STRICT и не может ссылаться $this в любой myMethod есть. Также см. PHP manual on possible callback formats.


Для проверки метода и класса на самом деле существует, вы можете использовать

Пример:

if (method_exists($myArray[0], $myArray[1])) { 
    call_user_func_array(*/ … */) 
} 

Просьба уточнить ваши Ques если есть что-то еще. On a sidenote, this was probably answered before, но поскольку я не уверен, в чем вопрос, я также не уверен, кого из них выбрать.

+0

это работает только со статическими методами, иначе вам нужен экземпляр класса –

+0

@kemp не верен, но добавил разъяснение. Я так думаю. – Gordon

+0

Ты прав, мой плохой –

1

Я думаю, это будет работать:

$obj = new $myArray[0]; 
$obj->{$myArray[1]}($myArray[2]); 
Смежные вопросы