從 JavaScript、C# 等語言轉 PHP 時,看似熟悉的語法往往暗藏行為差異。本文精選 4 個最高頻、最隱蔽的坑,附原理與避坑姿勢。
strrchr() 只匹配「字符」,不匹配「字符串」$a = 'abcdef.txt';
$b = '.php';
echo strrchr($a, $b); // 輸出 ".txt" 而非 false!
原因:strrchr 第二參數若為字符串,僅取首字符(此處為 '.')查找最後一次出現位置。PHP 無 strrstr,需自行實現或用 strripos + substr。
null、''、0 三者鬆散相等(==)全真,嚴格相等(===)全假$a = null; $b = ''; $c = 0;
var_dump($a == $b); // true
var_dump($a === $b); // false
var_dump($a == $c); // true
var_dump($b == $c); // true
鐵律:永遠優先使用 === / !==。只有明確需要類型轉換語義時才用 ==。
foreach 引用賦值後殘留引用,導致後續循環污染數據$a = [1,2,3];
foreach($a as &$item) { echo $item . ','; } // 1,2,3,
// unset($item); // 若忘記這行
foreach($a as $item) { echo $item . ','; } // 1,2,2 ← 最後元素被改為 1!
原理:首循環結束時 $item 仍引用 $a[2];次循環按值賦值時,實際修改了被引用的 $a[2]。
強制規範:foreach(... as &$v) { ... } unset($v); 成對出現。
isset() vs empty():只差一個 nullempty() 為 true 的 8 種情況:null、''、'0'、[]、false、0、0.0、未賦值屬性。
isset() 僅在 null 時返回 false,其餘 7 種全 true。
等價關係:除上述 7 種非 null 情況外,if(empty($x)) === if(!isset($x))。
掌握這 4 大坑,能讓你避開 80% 的 PHP 低級 Bug,寫出更健壯的代碼。