系統說明 PHP 中 Callback 函數的三種傳遞形式:一般函數名稱字串、靜態類方法陣列、物件實例方法陣列。並列出不可作為 callback 的語言結構清單,附完整可執行範例。
| 型態 | 傳遞語法 | 範例 |
|---|---|---|
| 一般函數 | 函數名稱字串 | 'my_callback_function' |
| 靜態類方法 | ['ClassName', 'methodName'] | ['MyClass', 'myCallbackMethod'] |
| 物件方法 | [$object, 'methodName'] | [$obj, 'myCallbackMethod'] |
array(), echo(), empty(), eval(), exit(), isset(), list(), print(), unset()
<?php
// 1. 一般函數
function my_callback_function() {
echo "hello world!\n";
}
// 2. 類別與方法
class MyClass {
public static function myCallbackMethod() {
echo "Hello World from static!\n";
}
public function myInstanceMethod() {
echo "Hello World from instance!\n";
}
}
// Type 1: 一般函數
call_user_func('my_callback_function');
// Type 2: 靜態類方法
call_user_func(['MyClass', 'myCallbackMethod']);
// Type 3: 物件方法
$obj = new MyClass();
call_user_func([$obj, 'myInstanceMethod']);
// 進階:搭配 array_map / usort
$numbers = [3, 1, 4, 1, 5];
usort($numbers, function($a, $b) { return $a - $b; });
print_r($numbers); // 排序後
?>
call_user_func() / call_user_func_array()array_map(), array_filter(), array_reduce(), array_walk()usort(), uasort(), uksort()preg_replace_callback()spl_autoload_register()<?php
$callable = ['MyClass', 'myCallbackMethod'];
if (is_callable($callable)) {
call_user_func($callable);
}
// 取得呼叫資訊
$info = (new ReflectionFunction($callable))->getFileName();
?>
Closure(匿名函數)取代字串函數名,支援 IDE 導航與靜態分析。callable(PHP 7.1+)或 Closure。call_user_func,直接呼叫閉包較快。掌握 Callback 三種形式與適用場景,能靈活設計可擴充、解耦的 PHP 架構。