作为程序员一定要保持良好的睡眠,才能好编程

call_user_fun和 call_user_func_array的区别

发布时间:2018-04-29

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