一, php手册的解释:
call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数
说明:
mixed call_user_func_array ( callable $callback , array $param_arr )
把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。
参数
callback 被调用的回调函数。
param_arr 要被传入回调函数的数组,这个数组得是索引数组。
返回值
返回回调函数的结果。如果出错的话就返回 FALSE
array_walk — 使用用户自定义函数对数组中的每个元素做回调处理
说明
bool array_walk ( array &$array , callable $funcname [, mixed $userdata = NULL ] )
将用户自定义函数 funcname 应用到 array 数组中的每个单元。 array_walk() 不会受到 array 内部数组指针的影响。
array_walk() 会遍历整个数组而不管指针的位置。
参数
array 输入的数组。
funcname 典型情况下 funcname 接受两个参数。array 参数的值作为第一个,键名作为第二个。
Note1:
如果 funcname 需要直接作用于数组中的值,则给 funcname 的第一个参数指定为引用。这样任何对这些单元的改变也将会改变原始数组本身。
Note2:
Many internal functions (for example strtolower() ) will throw a warning if more than the expected number of argument are
passed in and are not usable directly as funcname.
只有 array 的值才可以被改变,用户不应在回调函数中改变该数组本身的结构。例如增加/删除单元,unset 单元等等。如果 array_walk()
作用的数组改变了,则此函数的的行为未经定义,且不可预期。
userdata
如果提供了可选参数 userdata,将被作为第三个参数传递给 callback funcname。
返回值
成功时返回 TRUE , 或者在失败时返回 FALSE 。
二,实例
array_walk()函数应用实例:
$fruits = array( "d" => "lemon" , "a" => "orange" , "b" => "banana" , "c" => "apple" );
function test_alter (& $item1 , $key , $prefix )
{
$item1 = " $prefix : $item1 " ;
}
function test_print ( $item2 , $key )
{
echo " $key . $item2 <br />\n" ;
}
echo "Before ...:<br/>" ;
array_walk ( $fruits , 'test_print' );
echo "... and after:<br/>" ;
array_walk ( $fruits , 'test_alter' , 'fruit' );
array_walk ( $fruits , 'test_print' );
call_user_func_array()函数应用实例:
1,在类中的使用:
function foobar ( $arg , $arg2 )
{
echo __FUNCTION__ , " got $arg and $arg2 \n" ;
}
class foo
{
function bar ( $arg , $arg2 )
{
echo __METHOD__ , " got $arg and $arg2 \n" ;
}
}
// Call the foobar() function with 2 arguments
call_user_func_array ( "foobar" , array( "one" , "two" ));
// Call the $foo->bar() method with 2 arguments
$foo = new foo ;
call_user_func_array (array( $foo , "bar" ), array( "three" , "four" ));
2,作为一个完整的函数的传入:
function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
$fnName = "fnCallBack"; //方法名
$params = array( 'hello' , 'world' );//传给参数的值
call_user_func_array( $fnName , $params );
之所以写这些,是发现自己对这两个函数的概念和使用不是很清楚,因此重温一下。至于这两个函数的差别,个人感觉不是很大。
当遇到如下场景:要调用的函数名以及要调用函数的参数类型及个数也是未知的,因为未知,所以这个时候用call_user_func_array这样的函数。