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

posted @ 2021-01-03 14:28  九鹤  阅读(198)  评论(0编辑  收藏  举报