// PHP 5.4 或舊版:解析錯誤
if (empty(trim($name))) { ... }
// 正確寫法
$trimmed = trim($name);
if (empty($trimmed)) { ... }
// 或
if (trim($name) === '') { ... }
PHP 5.5+ 已支援任意表達式,但為相容舊環境建議避免直接傳入函式呼叫。
$safeIds = [987 => 'Alice', 1092 => 'Bob'];
$userInput = '1092 OR 1=1'; // SQL 注入嘗試
// 危險:鬆散比較 '1092 OR 1=1' == 1092 為 true
if (in_array($userInput, array_keys($safeIds))) {
echo 'Found'; // 被繞過!
}
// 安全:嚴格比較 (第三參數 true)
if (in_array($userInput, array_keys($safeIds), true)) {
// false,正確攔截
}
// 更好:使用 isset/array_key_exists (鍵值查找 O(1))
if (isset($safeIds[$userInput])) { ... }
$arr = ['a', 32, true, 'x' => 'y'];
var_dump(in_array(25, $arr)); // true (25 == 32? 否,但 25 == true 為 true!)
var_dump(in_array('ggg', $arr)); // true ('ggg' == true)
var_dump(in_array(0, $arr)); // true (0 == 'a'? 否,但 0 == false? 陣列無 false... 實際因 0 == 'a' 字串轉數字為 0)
var_dump(in_array(null, $arr)); // false
結論:永遠加上第三參數 true 啟用嚴格模式,或改用 isset()/array_key_exists() 查鍵。
$a = 0.1 + 0.2; // 0.30000000000000004
$b = 0.3;
var_dump($a === $b); // false
// 正確:設定容差
function floatEquals(float $a, float $b, float $epsilon = 1e-10): bool {
return abs($a - $b) < $epsilon;
}
$a = [5 => 'a', 6 => 'b']; $b = [7 => 'c']; var_dump(array_merge($a, $b)); // [0 => 'a', 1 => 'b', 2 => 'c'] 鍵值重排! // 保留鍵值用 + var_dump($a + $b); // [5 => 'a', 6 => 'b', 7 => 'c']
$arr = [1, 2, 3];
foreach ($arr as &$v) { $v *= 2; }
unset($v); // 必須 unset,否則 $v 仍參考最後一個元素
foreach ($arr as $v) { ... } // 此處 $v 會修改 $arr[2]!
===/!==,除非刻意需要類型轉換。in_array、array_search、switch 都預設鬆散比較,記得加 true 或改寫邏輯。bcmath 或存整數分/分。declare(strict_types=1); 強制函式參數/回傳型別。