call_user_func() 與 call_user_func_array() 實現動態函式呼叫,支援函式名稱字串、匿名函式、類別靜態方法、物件方法,並完整支援引用傳遞。
mixed call_user_func(callable $callback, mixed ...$args)
下列關鍵字不能作為 $callback:array()、echo()、empty()、eval()、exit()、isset()、list()、print()、unset()。
實戰坑點:若類別內有名為 list 的方法,呼叫 call_user_func([$obj, 'list']) 會觸發 Parse error: syntax error, unexpected T_LIST,因解析器誤判為語言結構。解法:改用 call_user_func_array() 或重新命名方法。
// 靜態方法
call_user_func(['MyClass', 'staticMethod'], 'arg1'); // 物件方法
$obj = new MyClass();
call_user_func([$obj, 'method'], 'arg1');
mixed call_user_func_array(callable $callback, array $args)
function add($a, $b) { return $a + $b; }
echo call_user_func_array('add', [10, 20]); // 30
function inc(&$n) { $n++; }
$val = 0;
call_user_func('inc', &$val); // $val = 1
call_user_func_array('inc', [&$val]); // $val = 2
Closure::bind() 快取。Closure::fromCallable() 可將 callable 轉為閉包,後續呼叫更快。