2008-10-11 73 views
2

我正在写在PHP构造物,其中解析器determins哪个函数动态调用,有点像这样:使用函数原型动态在PHP

// The definition of what to call 
$function_call_spec = array("prototype" => "myFunction", 
          "parameters" => array("first_par" => "Hello", 
                "second_par" => "World")); 

// Dispatch 
$funcPrototype = $function_call_spec["prototype"]; 
$funcPrototype(); // Here we call function 'myFunction'. 

这是所有罚款和花花公子。但现在下一步,传递参数,我不知道是否可能的方式,我想这样做。它永远不会停止惊人的我却什么脚本语言可以做这些天,所以这里有云:

人们可以通过参数来像这样的功能:

// Here we call function 'myFunction' with the array of parameters. 
$funcPrototype($function_call_spec["parameters"]); 

不过,我要声明“myFunction的”正常有明确的参数等:

function myFunction($first_par, $second_par) 
{ 

} 

接下来的问题如下 - 有什么办法参数通过参数数组循环动态简单地传递给函数?

为了澄清,我想要做这样的:

$funcPrototype($function_call_spec["parameters"]["first_par"], 
       $function_call_spec["parameters"]["second_par"] ); 

,因为这需要我的代码以静态知道myFunction的细节,这违背了这个念头。

相反,我会想这样做在某种程度上像这样也许:

// Special magic PHP function which can be used for invoking functions dynamically 
InvokeFunction($funcPrototype, $function_call_spec["parameters"]); 

然后导致myFunction的调用和阵列中的所有参数被传递给在原型每个单独的参数变量。

欢迎任何评论。

问候。

/R

PS:代码没有在这个岗位已经过测试,错别字等

回答

10

你应该使用call_user_func_array它可以调用任何函数或方法,并从数组中取参数。

或者,您可以使用ReflectionFunction::invokeArgs,但除call_user_func_array之外没有任何好处,除非您已经在某些其他方面使用此类(如检查您调用的函数是否接受适当的参数类型和类型)。

5
call_user_func_array($funcPrototype, $function_call_spec["parameters"]); 

您可能希望创建一个包装,名称的功能根据自己的喜好,如:

function InvokeFunction($function, $args = array()) { 
    return call_user_func_array($function, (array)$args); 
} 

有了这个功能,你可以把它在3种不同的方式:

$return = InvokeFunction('doStuff'); 
$return = InvokeFunction('doStuff', $single_arg); 
$return = InvokeFunction('doStuff', $multiple_args); 
+0

感谢您的咨询! – sharkin 2008-10-11 12:28:36

0

call_user_func_array()是最好的选择,如果你不需要执行合同,否则使用ReflectionFunction