isset、empty、is_null、unset 是 PHP 變量狀態檢測的核心工具,但語義重疊極易混淆。本文通過完整真值表、底層語義差異、典型業務場景,建立清晰的心智模型。
| 函數 | 用途 | 返回類型 | 副作用 |
|---|---|---|---|
isset() | 判斷變量已聲明且非 null | bool | 無 |
empty() | 判斷變量為空值(假值) | bool | 無 |
is_null() | 判斷變量嚴格等於 null | bool | 無 |
unset() | 銷毀變量,釋放內存 | void | 變量不再存在 |
| 變量狀態 | 代碼表示 | empty | is_null | isset |
|---|---|---|---|---|
| 空字符串 | $a = "" | true | false | true |
| null | $a = null | true | true | false |
| 未聲明 | var $a / 無定義 | true | true | false |
| 空數組 | $a = [] | true | false | true |
| 布爾 false | $a = false | true | false | true |
| 整數 0 | $a = 0 | true | false | true |
| 字符串 "0" | $a = "0" | true | false | true |
| 字符串 "true" | $a = "true" | false | false | true |
| 字符串 "false" | $a = "false" | false | false | true |
| 非零數值 | $a = 15 / 1 | false | false | true |
empty() ≈ !$var(鬆散假值判斷),含 "0"、0、0.0、false、""、[]、nullisset() 關注「變量是否存在且非 null」,只要賦過值(哪怕是 false/0/"")即為 trueis_null() 嚴格等價於 $var === null,是 isset() 的逆操作(針對已聲明變量)unset() 執行後,變量進入「未聲明」狀態,isset()=false、empty()=true、is_null()=true// 需求:用戶必須提交 username,且不能為空字符串
if (empty($_POST['username'])) {
die('用戶名不能為空');
}
// empty 同時覆蓋:未提交、提交空串、提交 "0" 視為空(業務通常合理)
$config['debug'] = false; // 明確關閉
$config['timeout'] = 0; // 明確無超時
// 錯誤:empty 會誤判
if (empty($config['debug'])) { ... } // 誤以為未配置
// 正確:isset 區分「已聲明」
if (!isset($config['debug'])) { /* 使用默認值 */ }
function foo($bar = null) {
if (is_null($bar)) { // 僅檢測是否傳遞 null,允許傳 false/0/""
$bar = 'default';
}
}
$hugeData = file_get_contents('1gb.log');
// 處理完畢
unset($hugeData); // 立即釋放內存,不等待 GC
isset() 可接受多參數:isset($a, $b, $c) 等價於 isset($a) && isset($b) && isset($c)empty() PHP 5.5+ 支持表達式:empty(trim($str)),舊版需用臨時變量__isset()、__get() 影響不可訪問屬性的判斷行為@ 抑制錯誤不影響 isset/empty 邏輯,但掩蓋真實問題
需要檢測變量
│
├─ 需銷毀變量 → unset()
│
├─ 需嚴格判斷 null → is_null() / $var === null
│
├─ 需判斷「是否聲明且非 null」 → isset()
│
└─ 需判斷「是否為空/假值」 → empty()
│
├─ 允許 "0"/0/false 視為有效 → 用 isset() + 額外判斷
└─ 業務視其為無效 → 直接 empty()
記住:isset 看存在性,empty 看真假性,is_null 看純粹性,unset 看生命週期。