PHP 的弱類型與隱式轉換機制造就了許多「反直覺」的行為,這些特性常成為面試考察重點。本文精選五道高陷阱題,逐層拆解底層原理,助你避開認知盲區。
$arr = [0 => 1, 'aa' => 2, 3, 4];
// 實際結構:[0=>1, 'aa'=>2, 1=>3, 2=>4]
foreach ($arr as $key => $val) {
print($key == 'aa' ? 5 : $val);
}
// 你的答案?
輸出:5534(而非直覺的 1534)
原因:== 觸發弱類型比較。當 string 比較 int 時,PHP 將字符串轉為整數:'aa' → 0。故 0 == 'aa' → true,首個元素鍵名 0 也匹配成功。
// 使用全等號 === 避免類型轉換 print($key === 'aa' ? 5 : $val); // 輸出:1534
$i = '11';
printf("%d\n", printf("%d", printf("%d", $i)));
// 輸出?
輸出:1121
關鍵點:printf 不僅輸出,返回輸出字符長度。
printf("%d", $i) → 輸出 11,返回 2(長度)printf("%d", 2) → 輸出 2,返回 1printf("%d\n", 1) → 輸出 1 + 換行最終輸出流:11 + 2 + 1\n = 1121\n
$a = 3; $b = 5;
if ($a = 5 || $b = 7) {
$a++; $b++;
}
echo $a . ' ' . $b; // 結果?
輸出:1 6
三層陷阱:
= vs ==:此處為賦值而非比較$a = 5 結果為 5(真),|| 短路,$b = 7 不執行$a = 5 返回 5,作為 if 條件被轉為 bool(true),進入分支分支內:$a++ 將 $a 從 5 變 6,但 echo $a 時 $a 是 bool(true) 轉字符串 '1'!
關鍵:$a = 5 || ... 中 $a 接收的是整個邏輯表達式的結果 true,而非 5!
// 等價邏輯 $a = (5 || ($b = 7)); // $a = true // 所以 $a++ 後 $a 變為 1 (true->int 1),echo 輸出 '1' $b 保持 5,未執行 $b=7,故輸出 6
$count = 5;
function get_count() {
static $count = 0;
return $count++;
}
++$count; // 全局 $count 變 6
get_count(); // 靜態 $count: 0→1,返回 0
echo get_count(); // 靜態 $count: 1→2,返回 1
// 輸出?
輸出:1(非直覺的 2)
關鍵點:
static $count 與全局 $count 完全無關,各自獨立return $count++ 是後置遞增:先返回當前值,再自增0,第二次返回 1$a = count("567") + count(null) + count(false);
echo $a; // 結果?
輸出:2
| 參數 | count() 結果 | 說明 |
|---|---|---|
"567" | 1 | 非數組標量視為 1 個元素 |
null | 0 | null 計數為 0 |
false | 1 | 布爾值視為 1 個元素(PHP 7.2+ 棄用警告) |
1 + 0 + 1 = 2
===/!==printf、count、array_search)= 低於邏輯 ||,但高於 orstatic 只在函數內保持狀態,不受外部同名變量影響++$a 返回新值,$a++ 返回舊值這些陷阱本質上考察的是對 PHP 類型系統、運算符語義、內部實現的深度理解。實戰中開啟 declare(strict_types=1)、使用靜態分析工具可大幅降低此類風險。