當直接對函數回傳值呼叫 empty() 時,PHP 會拋出致命錯誤:
Fatal error: Can't use function return value in write context in ... on line X
<?php
// 錯誤:直接檢查 strlen() 回傳值
echo empty(strlen('test')); // 觸發致命錯誤
根據 PHP 官方文件 明確規定:
empty()僅檢查變數,檢查任何非變數的運算式都會導致解析錯誤。換句話說,empty(trim($name))這樣寫是無效的。
技術層面上,empty() 是語言結構而非函數,其運作機制要求參數必須是可寫入的變數槽(以便檢查是否已設定且非空),函數回傳值只是暫時值,無法滿足此需求。
<?php
$length = strlen('test');
echo empty($length); // 正確輸出:bool(false)
若僅需判斷「是否為空字串/零/假值」,可直接比較:
<?php
$str = 'test';
// 判斷字串長度是否為 0
if (strlen($str) === 0) { ... }
// 判斷函數回傳是否為假值(false, null, 0, '', [] 等)
$result = some_function();
if (!$result) { ... } // 等同於 empty() 的邏輯判斷
/**
* 安全版 empty:接受任意運算式,回傳布林值
* 相當於 !isset($var) || !$var
*/
function is_empty($value) {
return empty($value); // 此處參數是變數 $value,合法
}
// 使用方式
if (is_empty(strlen('test'))) { ... }
if (is_empty(trim($input))) { ... }
| 情境 | empty($var) | isset($var) | is_null($var) | $var === null |
|---|---|---|---|---|
| 未定義變數 | true(不報錯) | false | 錯誤 | 錯誤 |
| null | true | false | true | true |
| '' (空字串) | true | true | false | false |
| 0 (整數零) | true | true | false | false |
| '0' (字串零) | true | true | false | false |
| false | true | true | false | false |
| [] (空陣列) | true | true | false | false |
| 資源/物件/非空值 | false | true | false | false |
empty()、isset()、unset() 等需變數參考的語言結構。filter_input() 或框架提供的驗證元件,而非手工 empty($_POST['key'])。?? 簡化預設值處理:$val = $_GET['key'] ?? 'default';