PHP 的強大很大程度上源於其龐大的內建函數庫,但許多實用函數與特性常被開發者忽略。本文精選幾個「隱藏寶石」,助你寫出更優雅、靈活的代碼。
你或許知道可選參數(預設值)寫法:
function foo($arg1 = '', $arg2 = '') {
echo "arg1:$arg1 ";
echo "arg2:$arg2 ";
}
foo('hello', 'world'); // arg1:hello arg2:world
foo(); // arg1: arg2:
但若參數數量完全不固定怎麼辦?PHP 提供 func_get_args()、func_num_args()、func_get_arg($index) 三大函數,支援可變長參數列表:
function foo() {
$args = func_get_args(); // 取得所有傳入參數陣列
foreach ($args as $k => $v) {
echo "arg" . ($k + 1) . ":$v ";
}
}
foo(); // (無輸出)
foo('hello'); // arg1:hello
foo('hello', 'world', 'again'); // arg1:hello arg2:world arg3:again
進階補充(PHP 5.6+):現代 PHP 推薦使用 ... 運算子(可變參數語法),語義更清晰、效能更好:
function sum(...$numbers) {
return array_sum($numbers);
}
echo sum(1, 2, 3, 4); // 10
| 函數 | 用途 | 範例 |
|---|---|---|
get_browser() |
解析 User-Agent,回傳瀏覽器能力資訊 | 需 browscap.ini 支援 |
highlight_file() / highlight_string() |
輸出語法高亮的 PHP 代碼 | 除錯、教學展示好幫手 |
ignore_user_abort() |
用戶斷開連線時是否繼續執行腳本 | 長時間任務(匯出、備份)必備 |
connection_aborted() |
檢測客戶端是否已斷開 | 配合上者實現優雅中斷 |
register_shutdown_function() |
註冊腳本結束(正常/錯誤/致命錯誤)時自動執行的回調 | 日誌記錄、資源清理、致命錯誤捕獲 |
fastcgi_finish_request() |
PHP-FPM 環境下提前結束請求回應,繼續後台執行 | 異步處理:先回應用戶,再發郵件、生成報表 |
gc_collect_cycles() |
強制執行垃圾回收(循環引用) | 長運行腳本(CLI、Worker)防記憶體洩漏 |
$logger = new class implements LoggerInterface {
public function log(string $msg) { echo "[LOG] $msg\n"; }
};
$logger->log('系統啟動');
適合一次性、簡單的介面實現,避免建立正式類別檔案。
$country = $user?->getAddress()?->getCountry()?->name;
// 任一環節為 null 直接回傳 null,不拋錯誤
$result = match ($status) {
'pending' => '待處理',
'paid' => '已付款',
'failed' => '失敗',
default => '未知狀態',
};
嚴格比較(===)、無需 break、可直接回傳值,比 switch 更現代安全。
善用 func_get_args()、... 可變參數、register_shutdown_function()、fastcgi_finish_request() 等特性,能顯著提升代碼彈性與效能。建議定期瀏覽 PHP 官方函數參考,總會發現新大陸。