PHP call_user_func() 和 call_user_func_array()
一、 call_user_func
作用
把第一个参数作为回调函数调用
说明
call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数
用法
1.基本用法
1 // 1.基本用法 2 function barber($type) 3 { 4 echo "{$type}<br/>"; 5 } 6 call_user_func('barber', "mushroom"); 7 call_user_func('barber', "shave");
2.使用命名空间
1 <?php 2 3 namespace Foobar; 4 5 class Foo 6 { 7 static public function test($name) 8 { 9 print "I'm {$name}.<br/>"; 10 } 11 } 12 13 call_user_func(__NAMESPACE__ . '\Foo::test', 'Sim'); // 第一种 14 call_user_func(array(__NAMESPACE__ . '\Foo', 'test'), 'Tony'); // 第二种
3.调用类中方法
1 // 3.调用类中方法 2 class myclass 3 { 4 public static function say_hello() 5 { 6 echo "Hello!\n"; 7 } 8 public function say_bye() 9 { 10 echo "Bye!\n"; 11 } 12 } 13 14 // 3.1静态方法的调用方式 15 $classname = "myclass"; 16 17 call_user_func(array($classname, 'say_hello')); 18 call_user_func($classname . '::say_hello'); // As of 5.2.3 19 20 $myobject = new myclass(); 21 22 call_user_func(array($myobject, 'say_hello')); 23 24 // 3.2非静态方法的调用方式 25 //当php <5.3时,可以如下使用,此时会把 b()方法当作是a的一个静态方式。 26 call_user_func(array("myclass", "say_bye")); 27 28 //当php >=5.3时,类的公开的非静态的方法必须在类实例化后方可被调用,否则会提示Strict性错误(为了兼容先前及以后的版本,还是用对象方法传入)。 29 $obj = new myclass; 30 call_user_func(array($obj, "say_bye")); // bye
二、call_user_func_array
和call_user_func很相似,不同点是把一个数组参数作为回调函数的参数
使用
1 // 1.使用 2 function foobar($arg, $arg2) 3 { 4 echo __FUNCTION__, " got $arg and $arg2<br/>"; 5 } 6 class foo 7 { 8 public function bar($arg, $arg2) 9 { 10 echo __METHOD__, " got $arg and $arg2<br/>"; 11 } 12 public static function bar2($arg, $arg2) 13 { 14 echo $arg . ' ' . $arg2 . '<br/>'; 15 } 16 } 17 18 // 1.1 调用函数 19 call_user_func_array("foobar", array("one", "two")); 20 21 // 1.2 调用类中方法 22 // 1.2.1 调用非静态方法 23 // php<5.3时,非静态的方法可直接传入类名 24 call_user_func_array(array('foo', 'bar'), array("three", "four")); 25 26 //php>=5.3时,非静态的方法 只有在类被实例化后方可调用,否则会提示Strict性错误 27 $foo = new foo; 28 call_user_func_array(array($foo, "bar"), array("three", "four")); 29 30 // 1.2.2 调用静态方法 31 call_user_func_array(array('foo','bar2'), array("five", "six")); 32 //或 33 call_user_func_array('foo::bar2', array("five", "six"));
三、使用引用
传入call_user_func()的参数不能为引用传递
1 // 使用引用 2 function incr(&$b) { 3 $b++; 4 } 5 6 $c = 0; 7 call_user_func_array('incr', array(&$c)); 8 echo $c; //显示 1
https://www.php.net/manual/zh/function.call-user-func.php
call_user_func ( callable $callback
[, mixed $parameter
[, mixed $...
]] ) : mixed