首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 開發易忽視的陷阱:empty()、in_array() 與類型比較

     編輯:PHP 綜合知識

陷阱一:empty() 僅接受變數 (PHP < 5.5)

// PHP 5.4 或舊版:解析錯誤
if (empty(trim($name))) { ... }

// 正確寫法
$trimmed = trim($name);
if (empty($trimmed)) { ... }
// 或
if (trim($name) === '') { ... }

PHP 5.5+ 已支援任意表達式,但為相容舊環境建議避免直接傳入函式呼叫。

陷阱二:in_array() 鬆散比較導致安全漏洞

$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])) { ... }

in_array() 更多怪異行為

$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']

陷阱五:foreach 參考變數殘留

$arr = [1, 2, 3];
foreach ($arr as &$v) { $v *= 2; }
unset($v); // 必須 unset,否則 $v 仍參考最後一個元素
foreach ($arr as $v) { ... } // 此處 $v 會修改 $arr[2]!

最佳實踐清單

  1. 比較一律用 ===/!==,除非刻意需要類型轉換。
  2. in_array、array_search、switch 都預設鬆散比較,記得加 true 或改寫邏輯。
  3. 浮點數金額計算用 bcmath 或存整數分/分。
  4. 開啟 declare(strict_types=1); 強制函式參數/回傳型別。
  5. 靜態分析工具:PHPStan (Level 5+)、Psalm、Rector 自動修復。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved