1.二话不说,先上官方例子
<?php // An example callback function function my_callback_function() { echo 'hello world!'; } // An example callback method class MyClass { static function myCallbackMethod() { echo 'Hello World!'.'<br/>'; } function myTwoCallback(){ echo 'hello dazhu'.'<br/>'; } } // Type 1: Simple callback call_user_func('my_callback_function'); // Type 2: Static class method call call_user_func(array('MyClass', 'myCallbackMethod')); call_user_func(array('MyClass', 'myTwoCallback'));//官方文档中没有提供非静态方法的这种使用,可是我这却能使用,疑问 // Type 3: Object method call $obj = new MyClass(); call_user_func(array($obj, 'myCallbackMethod')); call_user_func(array($obj, 'myTwoCallback')); // Type 4: Static class method call (As of PHP 5.2.3) call_user_func('MyClass::myCallbackMethod'); // Type 5: Relative static class method call (As of PHP 5.3.0) class A { public static function who() { echo "A\n"; } } class B extends A { public static function who() { echo "B\n"; } } call_user_func(array('B', 'parent::who')); // A // Type 6: function dazhu_callback_function($test) { echo $test; } call_user_func("dazhu_callback_function","dazhu come on"); // dazhu come on ?>
输出结果:
// Type 1结果 hello world! // Type 2结果 Hello World! hello dazhu // Type 3结果 Hello World! hello dazhu // Type 4结果 Hello World! // Type 5结果 A
call_user_func--->用法参考上述代码
返回值 :Returns the return value of the callback, or FALSE
on error.
注意 :在函数中注册有多个回调内容时(如使用 call_user_func() 与 call_user_func_array()),如在前一个回调中有未捕获的异常,其后的将不再被调用。
2.二话不说,再上个高级的官方例子
<?php // Our closure $double = function($a) { return $a * 2; }; // This is our range of numbers $numbers = range(1, 5); // Use the closure as a callback here to // double the size of each element in our // range $new_numbers = array_map($double, $numbers); print implode(' ', $new_numbers); ?> //输出结果:2 4 6 8 10
array_map--->将回调函数作用到给定数组的单元上
返回值 :返回一个数组,该数组包含了 arr1
中的所有单元经过 callback
作用过之后的单元。callback
接受的参数数目应该和传递给 array_map() 函数的数组数目一致
参见:
- array_filter() - 用回调函数过滤数组中的单元
- array_reduce() - 用回调函数迭代地将数组简化为单一的值
- array_walk() - 对数组中的每个成员应用用户函数
implode--->可以说是连接一个数组内的各个item。连接字符串用指定字符
返回值:Returns a string containing a string representation of all the array elements in the same order, with the glue string between each element.
举个简单例子:一目了然
<?php $array = array('lastname', 'email', 'phone'); $comma_separated = implode(",", $array); echo $comma_separated; //结果是 : lastname,email,phone ?>
参见:
- explode() - 使用一个字符串分割另一个字符串
- preg_split() - 通过一个正则表达式分隔字符串
- http_build_query() - 生成 URL-encode 之后的请求字符串
3.最后进入主题:
①一些函数可以接受用户自定义的回调函数作为参数,回调函数不止是简单自定义函数,也可以是对象方法,或者对象的静态方法
②一个 PHP 的函数以 string 类型传递其名称。可以使用任何内置或用户自定义函数,但除了语言结构例如: array(), echo, empty(), eval(), exit(), isset(), list(), print 或unset()。
③一个已实例化的对象的方法被作为数组传递,下标 0 包含该对象,下标 1 包含方法名。
④静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 'ClassName::methodName'。
⑤除了普通的用户自定义函数外, create_function() 可以用来创建一个匿名回调函数。自 PHP 5.3.0 起也可传递 closure 给回调参数
4.最后再加一个无关主题但是却很有用的知识点:
①.变量的引用
PHP 的引用允许你用两个变量来指向同一个内容
<? $a="ABC"; $b =&$a; echo $a;//这里输出:ABC echo $b;//这里输出:ABC $b="EFG"; echo $a;//这里$a的值变为EFG 所以输出EFG echo $b;//这里输出EFG ?>
②.函数的引用传递(传址调用)
传址调用我就不多说了 下面直接给出代码
<?php function test(&$a) { $a=$a+100; } $b=1; echo $b;//输出1 test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了 echo "<br>"; echo $b;//输出101 ?>