BB在前面
在PHP中,大多數情況下檢測變量時使用empty()
與isset()
,在不考慮極微小的性能差異的情況下是可以混用的,但它們之間的使用差異依舊會影響到我們程序的穩定運行。
empry()
判斷一個變量是否被認為是空的。當一個變量并不存在,或者它的值等同于
FALSE
,那么它會被認為不存在。如果變量不存在的話,empty()
并不會產生警告。
$a1 = [];
$a2 = [1,2,3];
$a4 = null;
$a5 = false;
$a6 = 0;
$a7 = 'null'
var_dump(empty($a1)); //true
var_dump(empty($a2)); //false
var_dump(empty($a3)); //true
var_dump(empty($a4)); //true
var_dump(empty($a5)); //true
var_dump(empty($a6)); //true
可以看出只要值等同于false的變量檢測變量是否為空時,都是返回true,并且檢測不存在的變量(代碼中的$a3
并未定義)時,代碼并不會報錯,所以可以認為empty()
有isset()
的作用。
注:empty()
并不能檢測空對象(new \stdClass
或(object)[]
)是否為空,檢測方法使用count()或get_class_vars、get_class_methods都為空
isset()
檢測變量是否設置,并且不是 NULL。
如果已經使用 unset() 釋放了一個變量之后,它將不再是 isset()。若使用 isset() 測試一個被設置成 NULL 的變量,將返回 FALSE。同時要注意的是一個 NULL 字節("\0")并不等同于 PHP 的 NULL 常數。
$a1 = [];
$a2 = [1,2,3];
$a4 = null;
$a5 = false;
$a6 = 0;
$a7 = 'null';
var_dump(isset($a1)); // true
var_dump(isset($a2)); // true
var_dump(isset($a3)); // false
var_dump(isset($a4)); // false
var_dump(isset($a5)); // true
var_dump(isset($a6)); // true
var_dump(isset($a7)); // true
可以看出來只有在變量未定義或被設置為null
時 ,返回false
,設置為其他值等同于與false
的值,都返回true
。
大膽猜測:當變量被定義為null
是返回false
的原因可能是和PHP的垃圾回收機制有關。PHP 使用了引用計數 (reference counting) GC 機制。每個對象都內含一個引用計數器 refcount,每個 reference 連接到對象,計數器加 1。當 reference 離開生存空間或被設為 NULL,計數器減 1。當某個對象的引用計數器為零時,PHP 知道你將不再需要使用這個對象,釋放其所占的內存空間。
總結
當我們需要判斷變量是否被定義或為NULL
,使用iseet()
,判斷變量是否是一個為false
的值使用empty()
附:值為false的值
字符類型:''、""、'0'、"0"
數字類型:0
布爾類型: false
空類型:null、NULL
數組類型:[]