## Callback / Callable 类型(复合)
自 PHP 5.4 起可用 [callable](http://php.net/manual/zh/language.types.callable.php) 类型指定回调类型 callback。本文档基于同样理由使用 [callback](http://php.net/manual/zh/language.pseudo-types.php#language.types.callback) 类型信息。
一些函数如 [call\_user\_func()](http://php.net/manual/zh/function.call-user-func.php) 或 [usort()](http://php.net/manual/zh/function.usort.php) 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。
### 传递
PHP是将函数以string形式传递的。可以使用任何内置或用户自定义函数,但除了语言结构例如:[array()](http://php.net/manual/zh/function.array.php),[echo](http://php.net/manual/zh/function.echo.php),[empty()](http://php.net/manual/zh/function.empty.php),[eval()](http://php.net/manual/zh/function.eval.php),[exit()](http://php.net/manual/zh/function.exit.php),[isset()](http://php.net/manual/zh/function.isset.php),[list()](http://php.net/manual/zh/function.list.php),[print](http://php.net/manual/zh/function.print.php) 或 [unset()](http://php.net/manual/zh/function.unset.php)。
一个已实例化的 [object](http://php.net/manual/zh/language.types.object.php) 的方法被作为 [array](http://php.net/manual/zh/language.types.array.php) 传递,下标 0 包含该 [object](http://php.net/manual/zh/language.types.object.php),下标 1 包含方法名。 在同一个类里可以访问 protected 和 private 方法。
静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 *'ClassName::methodName'*。
除了普通的用户自定义函数外,也可传递 [匿名函数](http://php.net/manual/zh/functions.anonymous.php) 给回调参数。
**Example #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!';
}
}
// Type 1: Simple callback
call_user_func('my_callback_function');
// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod'));
// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// 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: Objects implementing __invoke can be used as callables (since PHP 5.3)
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
```
**Example #2 使用 Closure 的示例**
```
<?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);
?>
```
- 序言
- 简介
- PHP是什么?
- PHP能做什么?
- 基本语法
- 类型
- boolean(布尔型)
- integer(整型)
- float(浮点型)
- string(字符串)
- array(数组)
- object(对象)
- callable(可调用)
- resource(资源)
- NULL(无类型)
- 伪类型
- 类型转换的判别
- 变量
- 基础
- 预定义变量
- 变量范围
- 可变变量
- 来自PHP之外的变量
- 常量
- 语法
- 魔术常量
- 表达式
- 运算符
- 运算符优先级
- 算术运算符
- 赋值运算符
- 位运算符
- 比较运算符
- 错误控制运算符
- 执行运算符
- 递增/递减运算符
- 逻辑运算符
- 字符串运算符
- 数组运算符
- 类型运算符
- 流程控制
- if
- else
- elseif/else if
- 流程控制的替代语法
- while
- do-whille
- for
- foreach
- break
- continue
- switch
- declare
- return
- require
- include
- require_once
- include_once
- goto
- 函数
- 用户自定义函数
- 函数的参数
- 返回值
- 可变函数
- 内部 (内置)函数
- 匿名函数
- 类与对象
- 简介
- 基本概念
- 属性
- 类的自动加载
- 构造函数
- 访问控制(可见性)