PHP 允許為函數參數指定默認值,調用時省略該參數即自動使用默認值,極大增強 API 靈活性。本文通過示例講解語法、調用規則及常見類型陷阱。
<?php
function capitalize($str, $each = true) {
$str = strtolower($str);
if ($each === true) {
$str = ucwords($str); // 每個單詞首字母大寫
} else {
$str = strtoupper($str); // 全部大寫
}
echo "$str
";
}
capitalize("hEllo WoRld!"); // 使用默認 $each=true → Hello World!
capitalize("hEllo WoRld!", false); // 顯式傳遞 false → HELLO WORLD!
?>
time())、new Class() 等。
// ❌ 錯誤
function foo($a = time()) {}
function bar($b = $someVar) {}
function baz($c = new DateTime()) {}
// ✅ 正確
function foo($a = 0) {}
function bar($b = 'default') {}
function baz($c = []) {}
// ❌ 錯誤
function foo($a = 1, $b) {}
// ✅ 正確
function foo($b, $a = 1) {}
foo(null) 會將參數設置為 null,而非默認值。需用 foo() 省略參數。function foo(int $a = 0) 合法,默認值需符合類型約束。function query($sql, $params = [], $fetchMode = PDO::FETCH_ASSOC) { ... }
$query("SELECT * FROM users");
$query("SELECT * FROM users WHERE id=?", [1]);
$query("SELECT * FROM users", [], PDO::FETCH_OBJ);
function getLogger($logger = null) {
if ($logger === null) {
$logger = new Monolog\Logger('app');
}
return $logger;
}
| 代碼 | 結果 | 說明 |
|---|---|---|
| foo() | 使用默認值 | 正確 |
| foo(null) | 參數=null | 不觸發默認值 |
| foo(0) | 參數=0 | 顯式傳遞 |
| function($a=[]){$a[]=1;} | 每次調用共享同一數組? | ❌ PHP 中默認值在定義時求值,每次調用都是新數組,安全 |
善用默認參數,能編寫出接口簡潔、向後兼容、易於擴展的函數簽名,是 PHP 開發者必備基本功。