PHP 支援「變數函數」:將函數名稱存放在變數中,透過變數加上括號 () 即可動態呼叫。本文說明基本語法、參數傳遞、靜態方法呼叫與 call_user_func() 替代方案。
<?php
function add($a, $b) {
return $a + $b;
}
$funcName = 'add';
echo $funcName(3, 6) . "\n"; // 9
// 等同於
echo call_user_func('add', 3, 6) . "\n"; // 9
?>
<?php
class Math {
public static function add($a, $b) { return $a + $b; }
public static function mul($a, $b) { return $a * $b; }
}
$method = 'add';
echo Math::$method(2, 3) . "\n"; // 5 (PHP 7+ 支援)
echo call_user_func(['Math', 'mul'], 2, 3) . "\n"; // 6
?>
<?php
class Greeter {
public function greet($name) { return "Hello, $name!"; }
}
$obj = new Greeter();
$method = 'greet';
echo $obj->$method('World') . "\n"; // Hello, World!
echo call_user_func([$obj, 'greet'], 'PHP') . "\n"; // Hello, PHP!
?>
<?php
class User {
public function __construct(public string $name) {}
}
$className = 'User';
$user = new $className('Alice'); // PHP 8+ 命名參數也支援
var_dump($user);
?>
<?php
function sum(...$numbers) {
return array_sum($numbers);
}
$args = [1, 2, 3, 4, 5];
echo call_user_func_array('sum', $args) . "\n"; // 15
// 等同於 PHP 5.6+ ... 運算子
echo sum(...$args) . "\n"; // 15
?>
$allowed = ['add', 'sub', 'mul', 'div'];
if (in_array($funcName, $allowed, true)) {
$funcName($a, $b);
}
call_user_func() 有微小額外開銷,熱路徑建議直接呼叫。/** @var callable $func */。變數函數提供 PHP 動態呼叫能力,配合白名單機制可安全實現策略模式、插件系統、路由分派等架構。現代 PHP 8+ 語法更簡潔強大。希望本文對您的 PHP 程式設計有所幫助。