PHP 支持變量函數:將函數名作為字符串賦值給變量,隨後通過變量名加括號即可調用對應函數。這為插件系統、策略模式、路由分發等動態調度場景提供了極簡單的原生實現方式。
$var(...) 語法調用<?php
function addition($a, $b) {
echo ($a + $b) . "\n";
}
$result = "addition"; // 變量存儲函數名
$result(3, 6); // 動態調用 → 輸出 9
?>
<?php
function payByAlipay($amount) { echo "支付寶支付 $amount 元\n"; }
function payByWechat($amount) { echo "微信支付 $amount 元\n"; }
function payByUnionPay($amount) { echo "銀聯支付 $amount 元\n"; }
$payMethods = [
'alipay' => 'payByAlipay',
'wechat' => 'payByWechat',
'unionpay'=> 'payByUnionPay',
];
$selected = $_GET['method'] ?? 'alipay';
if (isset($payMethods[$selected])) {
$func = $payMethods[$selected];
$func(100); // 動態分發
} else {
echo "不支持的支付方式";
}
?>
echo()、print()、unset()、isset()、empty()、include()、require() 等不能作為變量函數調用。is_callable() 驗證:調用前檢查 is_callable($func),避免報錯。| 特性 | 變量函數 | 匿名函數 | 可調用類 |
|---|---|---|---|
| 定義靈活性 | 僅限已定義函數名 | 任意邏輯內聯定義 | 完整類結構,可維護狀態 |
| 性能 | 極高(直接調用) | 高(編譯緩存) | 高 |
| 可讀性/維護性 | 分散定義,難追蹤 | 集中定義,清晰 | 結構化,適合複雜邏輯 |
| 類型提示/IDE支持 | 無 | 有(PHP 7.1+) | 完整支持 |
變量函數是 PHP 動態特性的基石之一,理解其機制有助於閱讀舊代碼、設計輕量級分發器。新項目優先考慮現代替代方案,構建更健壯的架構。