我不理解call_user_func()这个函数的作用,虽然我知道它是如何工作的,但我不确定为什么它是必需的,以及在什么上下文中在PHP中使用它。 就我而言,为什么不直接调用该函数而不是使用一个函数来调用另一个函数呢?谢谢!
我不理解call_user_func()这个函数的作用,虽然我知道它是如何工作的,但我不确定为什么它是必需的,以及在什么上下文中在PHP中使用它。 就我而言,为什么不直接调用该函数而不是使用一个函数来调用另一个函数呢?谢谢!
<window id="login-win" title="Access Restricted" width="310" height="186" layout="accordion" layoutConfig="animate:true">
<panel id="login-panel" title="User Login">
<form id="login-form" title="Credentials">
<textbox id="login-uname" label="Username"/>
<password id="login-pass" label="Password"/>
<submit text="Login"/>
</form>
</panel>
<panel id="login-register" title="Register">
Nothing, you can't register!
</panel>
</window>
function tag_submit($variables, $parent, $children){
// deal with the data, then echo what is needed
}
$f(); // Call $f
$obj = new stdClass;
$obj->my_func = function() {};
$obj->my_func(); // Error: stdClass does not have a "my_func" method
call_user_func($obj->my_func); // Calls $obj->my_func
有时候PHP无法理解正常的括号语法,例如,PHP目前(5.5)不知道如何调用另一个可调用对象的返回值:
get_a_callable()(); // Parse error, unexpected "("
call_user_func(get_a_callable()); // Calls the return value of get_a_callable
目前也无法直接调用函数定义,这在解决 PHP 缺乏“let”语句的问题时非常有用,例如:
function($x) { echo $x . $x; }('hello'); // Parse error, unexpected "("
call_user_func(function($x) { echo $x . $x; }, 'hello'); // Calls the function
有时候将函数调用/reified/作为'call_user_func'函数也是很有用的。例如,在使用高阶函数如array_map时:
$funcs = [function() { return 'hello'; },
function() { return 'world'; }];
array_map('call_user_func', $funcs); // ['hello', 'world']
如果我们不知道需要多少个参数,即我们无法替换自己的“function($f, $x, $y, ...) { return $f($x, $y, ...); }”,它也很有用。
其中一个特别好的定义是部分应用程序,由于call_user_func和call_user_func_array,只需要几行代码就可以实现:
function partial() {
$args1 = func_get_args(); // $f, $a, $b, $c, ...
return function() use ($args1) {
// Returns $f($a, $b, $c, ..., $d, $e, $f, ...)
$args2 = func_get_args(); // $d, $e, $f, ...
return call_user_func_array('call_user_func',
array_merge($args1, $args2));
};
}