呼叫 empty(trim($str)) 直接拋出 Fatal error: Can't use function return value in write context。這不是 Bug,而是 PHP 語言設計限制:empty() 只接受變數,不接受運算式/函式回傳值。
<?php
$str = " ";
if (empty(trim($str))) { // Fatal error
echo "empty";
}
empty() 內部實作需取得變數的符號表引用(以檢查是否設定、是否為 null/false/0/空字串/空陣列),函式回傳值是暫時值,無符號表項目,無法傳址。
官方文件定義:bool empty ( mixed $var ) — 參數必須是變數。
<?php
$str = " ";
$trimmed = trim($str);
if (empty($trimmed)) {
echo "empty";
}
<?php
$str = " ";
if (trim($str) === '') { // 或 === false, === null, === 0 視需求
echo "empty";
}
<?php
function is_empty($value) {
return empty($value);
}
// 現在可以傳運算式
if (is_empty(trim($str))) {
echo "empty";
}
| 函式 | 是否接受運算式 | 正確用法 |
|---|---|---|
| empty() | 否 | empty($var) |
| isset() | 否 | isset($var) |
| unset() | 否 | unset($var) |
| array_pop() | 需變數參考 | array_pop($arr) |
| array_shift() | 需變數參考 | array_shift($arr) |
| reset() | 需變數參考 | reset($arr) |
| end() | 需變數參考 | end($arr) |
| next()/prev()/current() | 需變數參考 | next($arr) |
empty() 支援任意運算式(如 empty($obj->getName())),但 PHP 5.4 及舊版仍報錯。$v = trim($str); if (empty($v)) — 除錯時可直接 var_dump($v)。=== ''、=== null、=== false — 語意明確,效能最佳。記住:empty() 本質是「檢查變數是否存在且為空值」,不是「檢查值是否為空」。這語意差異正是它只接受變數的原因。