2010-12-11 76 views
5

我刚刚构建了一个函数,它获取URI字符串并将其转换为数组,如下所示。这个例子是基于对http://mydomain.com/mycontroller/mymethod/varPHP:从数组中调用一个类?

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

如果我写new $myArray[0];的URL,我会加载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通知,并在任何myMethod是不能引用$this。另请参阅PHP manual on possible callback formats


为了验证方法和类的实际存在,你可以使用

例子:

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

请澄清你的疑问句如果还有其他意思的话。 On a sidenote, this was probably answered before,但由于我不确定问题是什么,我也不确定选择哪一个。

+0

用静态方法才会有效,否则你需要的类 – 2010-12-11 15:18:55

+0

@kemp不是真正的实例,倒是澄清。我认为这就是你的意思。 – Gordon 2010-12-11 15:19:19

+0

你说得对,我的不好 – 2010-12-11 15:20:51

1

我想这也将工作:

$obj = new $myArray[0]; 
$obj->{$myArray[1]}($myArray[2]);