call_user_func() 执行方法,以前认为此函数是没有返回值的。
如果调用的函数中没有返回值,如若我们接收了返回结果,那么会是null
//先引用后增加 function _call($call) { //通过传参获取call_user_func传过来的参数 echo $call++, '<br/>'; echo $call++, "<br/>"; } //上面回调函数没有返回值,所以,这里就没有返回值,_call为上面的函数的名称 $re = call_user_func('_call', 1); //实验结果为 null,符合上面的结论 var_dump($re);
call_user_func 可以传递多个参数:
例
function call($call, $str, $bb) { var_dump($str); var_dump($bb); //通过传参获取call_user_func传过来的参数 return $call + 1; } $re = call_user_func('call', 4, 'james', 'enennee'); var_dump($re);
运行结果:5
调用类中的方法:
class myclass { static function say_hello() { echo "Hello!\n"; } } $classname = "myclass"; call_user_func(array($classname, 'say_hello')); call_user_func($classname .'::say_hello'); // As of 5.2.3 $myobject = new myclass(); call_user_func(array($myobject, 'say_hello'))
运行结果:
Hello! Hello! Hello!
带有命名空间的的调用:
namespace Foobar; class Foo { static public function test() { print "Hello world!\n"; } } call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0 call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); // As of PHP 5.3.0
call_user_func_array函数的使用:
function testff($name, $age) { var_dump($name); var_dump($age); } call_user_func_array('testff', ['name', 'age']);
function testff($name, $age) {
var_dump($name);
var_dump($age);
}
// call_user_func_array('testff', ['name'=>'james', 'age'=>'22']);
如果代码写成这样,那么第一个参数 name 会打印出 james ?
call_user_func_array('testff', ['age'=>'22','name'=>'james']);
答案: 是不会的,会打印出 22
age 会打印出 james 这个函数的使用也是
call_user_func_array() 第二个参数必须是索引数组,这样就和调用方法中的参数值一一对应了。
class_user_func_array最多传递两个参数,不能传递第三个参数,这是报错的。
例如:
function testff($name, $age) {
var_dump($name);
var_dump($age);
}
call_user_func_array('testff', ['name', 'age'],'bbbdds');
arning: call_user_func_array() expects exactly 2 parameters, 3 given in D:\phpStudy\WWW\test\call_user_func.php on line 35 Call Stack: 0.0030 347872 1. {main}() D:\phpStudy\WWW\test\call_user_func.php:0 0.0040 348176 2. call_user_func_array:{D:\phpStudy\WWW\test\call_user_func.php:35}() D:\phpStudy\WWW\test\call_user_func.php:35 PHP Warning: call_user_func_array() expects exactly 2 parameters, 3 given in D:\phpStudy\WWW\test\call_user_func.php on line 35 PHP Stack trace: PHP 1. {main}() D:\phpStudy\WWW\test\call_user_func.php:0 PHP 2. call_user_func_array:{D:\phpStudy\WWW\test\call_user_func.php:35}() D:\phpStudy\WWW\test\call_user_func.php:35
与call_user_func函数类似的还有一个call_user_func_array函数,这个函数的调用和作用和call_user_func函数基本一样,所不同的是,call_user_func_array函数只能传递两个参数,第一个是回调函数名,或者匿名函数,或者类方法,第二个参数则是数组,从这里也可以看出,其实call_user_func_array函数与call_user_func不同的是,call_user_func_array是利用回调函数处理数组,而call_user_func则是利用回调函数处理字符串,他们两个的根本差别就在这里了。你自己可以尝试的调用call_user_func_array()函数,因为它们的引用基本一样,所以关于call_user_func_array就不再多写了。