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.0call_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就不再多写了。