## 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
- 函數
- 用戶自定義函數
- 函數的參數
- 返回值
- 可變函數
- 內部 (內置)函數
- 匿名函數
- 類與對象
- 簡介
- 基本概念
- 屬性
- 類的自動加載
- 構造函數
- 訪問控制(可見性)