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

PHP in_array() 類型鬆散比較陷阱與解決方案

     編輯:PHP 綜合知識

前言

in_array() 預設使用鬆散比較(==),導致 0、''、null、false 互相匹配,是極易踩坑的「弱類型陷阱」。本文還原實戰場景,演示問題並給出兩種修復方案。

一、業務場景

發票方式枚舉:0=捐贈、1=郵寄、2=索取、3=電子發票。驗證代碼:

if (!in_array($_POST['invoice_action'], [0,1,2,3])) {
    throw new Exception('請選擇正確的發票方式');
}

問題:若 $_POST['invoice_action'] 不存在(null)或為空字符串,驗證竟通過!

二、根因演示

var_dump(in_array('', [0]));      // true
var_dump(in_array(null, [0]));    // true
var_dump(in_array(false, [0]));   // true

因 PHP 鬆散比較規則:0 == '' == null == false 均為 true。

三、解決方案

方案一:啟用嚴格模式(推薦)

in_array() 第三參數設為 true,啟用嚴格比較(===):

var_dump(in_array('', [0], true));      // false
var_dump(in_array(null, [0], true));    // false
var_dump(in_array(false, [0], true));   // false

修正業務代碼:

if (!in_array($_POST['invoice_action'], [0,1,2,3], true)) { ... }

方案二:統一數據類型

將數組值轉為字符串,配合嚴格模式或不啟用嚴格模式均可:

var_dump(in_array('', ['0','1','2','3'], true)); // false

但需注意:輸入端也需轉字符串,否則 0 (int) 不等於 '0' (string)。

四、最佳實踐建議

  1. 默認啟用嚴格模式:除非明確需要類型轉換,所有 in_array、array_search、switch 等比較操作均建議加第三參數 true。
  2. 輸入驗證先行:使用 filter_input() 或手動 isset() + 類型轉換,確保進入業務邏輯的數據類型符合預期。
  3. 枚舉值建議用字符串:如 ['donate','post','request','electronic'],從根源避免數字 0 的鬆散比較陷阱。

五、延伸:其他受影響函數

  • array_search()
  • switch ($x) { case 0: ... }(同樣用 ==)
  • == 條件判斷

統一原理:嚴格比較(===)或統一類型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved