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

PHP empty()、is_null()、isset() 三函數終極對比:真值表、適用場景與避坑指南

     編輯:PHP 相關知識

這三個函數是 PHP 變量狀態判斷的核心工具,但行為差異極大。本文通過真值表、底層語義分析、實戰場景映射,建立清晰的決策模型。

核心語義速查

函數判斷目標返回 true 條件參數要求
isset()變量是否「存在且非 null」已定義 且 ≠ null只能是變量(可多個參數,全 true 才返回 true)
empty()值是否為「假值」== false(0, '', '0', null, false, [], 未定義)只能是變量(PHP 5.5+ 支援表達式)
is_null()值是否「嚴格為 null」=== null任意表達式(未定義變量會 Warning)

完整真值表

變量狀態值isset()empty()is_null()(bool)
未定義-falsetrueWarning+truefalse
定義未賦值-falsetrueWarning+truefalse
賦值 nullnullfalsetruetruefalse
賦值 falsefalsetruetruefalsefalse
賦值 00truetruefalsefalse
賦值 '0''0'truetruefalsefalse
賦值 ''''truetruefalsefalse
賦值 [][]truetruefalsefalse
賦值 11truefalsefalsetrue
賦值 'hello''hello'truefalsefalsetrue
賦值 [1][1]truefalsefalsetrue
賦值 new StdClass()objecttruefalsefalsetrue

關鍵推論規律

  1. empty($var) === !(bool)$var (不報錯版);
  2. is_null($var) === !$var === null 但 is_null 會對未定義變量報 Warning;
  3. isset($var) === !is_null($var) 當變量已定義時;
  4. isset($var) && !empty($var) ⇔ 變量存在且為真值(非 0、非空、非 false、非 null)。

實戰決策樹:我該用哪個?

// 1. 判斷配置項是否「用戶顯式設置」(區分 null 和未設置)
if (isset($config['key'])) { ... } // 用戶可能設置為 null 也視為已設置

// 2. 判斷輸入是否「有實際內容」(拒絕 0、'0'、false、空陣列)
if (!empty($input)) { ... } // 最常用:表單驗證、API 參數檢查

// 3. 判斷變量是否「確切為 null」(如緩存未命中標記)
if ($cache->get($key) === null) { ... } // 推薦用 === null,不報錯
// 或
if (is_null($cache->get($key))) { ... } // 確定變量已定義時可用

// 4. 判斷陣列鍵是否存在(不關心值)
if (array_key_exists('key', $arr)) { ... } // 包含 null 值
if (isset($arr['key'])) { ... }            // 排除 null 值

// 5. 多變量同時檢查
if (isset($a, $b, $c)) { ... } // 全部存在且非 null
if (empty($a) || empty($b)) { ... } // 任一為空

高頻避坑指南

錯誤代碼問題修正
empty($obj->prop)PHP 5.5+ 支援,但魔術 __get 可能觸發副作用先 isset($obj->prop) 再取值
is_null($undefined)觸發 Warning 污染日誌用 === null 或 isset() 反向
isset($arr['key']) 判斷鍵存在值為 null 返回 false用 array_key_exists()
empty($var) 當 $var='0'業務上 '0' 可能是有效值(如狀態碼)顯式 $var === '' || $var === null ...
isset($var) 用於屬性/數組元素魔術方法/偏移不存在不報錯但返回 false屬性用 property_exists(),陣列用 array_key_exists()

性能微優化

  • isset()、empty() 是語言構造,非函數調用,極快;
  • is_null() 是函數,有微小開銷,熱路徑用 === null;
  • 批量檢查用 isset($a, $b, $c) 單次調用。

建立「語義 → 函數」的肌肉記憶,比背誦真值表更可靠。

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