HOWTO · PHP
PHP 中的 isset() 與 empty() 函式
本文介紹 PHP 中的 isset() 和 empty() 函式。
本頁內容
在 PHP 中,isset() 會在變數已存在且不為 null 時回傳 true。empty() 則會在值不存在,或被 PHP 視為 false 時回傳 true。檢查表單欄位時,這項差異很重要:欄位可能存在,但其中的值仍會被 empty() 視為空。
isset() 和 empty() 的差異
若要檢查變數是否存在且不為 null,請使用 isset();若要檢查值是否不存在或屬於 falsey 值,請使用 empty()。特別要注意,0 和字串 "0" 都是已設定的值,但 empty() 會將兩者視為空。
| 值 | isset($value) |
empty($value) |
|---|---|---|
| 未定義的變數 | false |
true |
null |
false |
true |
false |
true |
true |
0 |
true |
true |
"0" |
true |
true |
"" |
true |
true |
[] |
true |
true |
"hello" |
true |
false |
PHP 還會將 0.0 等其他值視為 false。關鍵差異在於,isset() 只會對未定義或值為 null 的變數回傳 false;empty() 則還會將 false、零、字串 "0"、空字串及空陣列視為空。這些檢查只能說明值是否存在及其真假值狀態,無法證明輸入對特定用途而言安全或有效。
使用 isset() 檢查變數是否已設定
isset() 會檢查變數是否存在且值不為 null。例如,包含姓名或數字 0 的變數會通過檢查;值為 null 的變數則不會。讀取選填的請求資料,或使用可能尚未指定的值之前,這個函式便能派上用場。它也能一次檢查多個變數;只有在每個引數都已定義且不為 null 時,結果才會是 true。以下簡短程式會使用提供的姓名,並在 PHP 能讀取該值時輸出訊息。
執行以下範例。程式碼及其標籤或輸出維持英文。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
<?php
$name = "Mina";
if (isset($name)) {
echo "Name is set.\n";
}
Name is set.
例如,isset($first, $last) 會在一次呼叫中檢查這兩個變數。如果你需要指出缺少的是哪個欄位,請分別檢查。檢查 $_GET['name'] 這類陣列索引鍵時,isset() 也很實用;若索引鍵不存在,它會安全地回傳 false。
使用 empty() 檢查值是否為空
即使變數未定義,empty() 也會回傳 true,而且不會產生未定義變數警告。值為 null、false、0、0.0、"0"、"" 或空陣列時,它同樣會回傳 true;像 "hello" 這樣的非空字串則會回傳 false。這個判斷範圍比檢查字串是否為零個字元更廣,因此如果 "0" 應該算是有意義的輸入,就不要使用 empty()。
若值必須存在且有意義,請明確檢查這兩項條件。例如,isset($value) && $value !== '' 會排除未定義、null 或空字串的值,但會接受 0 和 "0"。請依照輸入值的意義選擇條件,不要直接假設所有 falsey 值都無效。
使用 isset() 和 empty() 檢查表單輸入
表單的 name 和 email 欄位會以請求參數的形式傳入。先確認兩個參數都有提供,再確認它們是字串,之後才修剪姓名並檢查是否空白。像 name[]=Mina 這樣的查詢會傳入陣列,因此處理程式會回報欄位必須是文字,而不會將該值傳給 trim()。以下 PHP 範例會讀取以 GET 方法送出的資料,並回報姓名是否需要處理。它不會驗證電子郵件地址的格式、所有權或是否可送達;姓名不為空,也不代表其中只包含字母。
以下簡易瀏覽器表單會將兩個具名欄位以 GET 參數傳送至包含該表單的頁面:程式碼及其標籤或輸出維持英文。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
<form method="get">
<label>Name: <input name="name" type="text"></label>
<label>Email: <input name="email" type="text"></label>
<button type="submit">Check fields</button>
</form>
PHP 處理程式接著可以分辨請求是否包含兩個欄位,或其中一個欄位未提供:
<?php
if (!isset($_GET['name'], $_GET['email'])) {
echo "Submit both fields first.\n";
} elseif (!is_string($_GET['name']) || !is_string($_GET['email'])) {
echo "Name and email must be text fields.\n";
} else {
$name = trim($_GET['name']);
$email = $_GET['email'];
if (empty($name)) {
echo "Enter a name.\n";
} else {
echo "Name is present; email was supplied.\n";
}
}
由於 empty() 也會將 "0" 視為空,因此這個範例會把只包含該字元的姓名視為空白。程式只檢查電子郵件變數是否存在;實際應用程式應依需求採用適當的驗證和輸出跳脫方式。isset() 和 empty() 都不會檢查電子郵件格式,也無法證明姓名只包含字母。