3

我正在用 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:这篇文章中的所有代码都没有经过拼写等测试。

4

4 回答 4

11

您应该使用call_user_func_arraywhich 可以调用任何函数或方法并从数组中获取参数。

或者,您可以使用ReflectionFunction::invokeArgs,但没有任何好处,call_user_func_array除非您已经将此类用于其他用途(例如检查您调用的函数是否接受适当数量和类型的参数)。

于 2008-10-11T11:49:10.283 回答
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);
于 2008-10-11T11:48:10.723 回答
0

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

于 2008-10-11T12:53:21.433 回答
0

http://us2.php.net/create_function

当您使用 create_function() 时,直到运行时才会评估您的参数。挺甜的。

于 2009-01-29T19:00:12.170 回答