天天看點

php empty,isset,is_null比較(差異與異同) Leone

做php開發時候,想必在使用:empty,isset,is_null  這幾個函數時候,遇到一些問題。甚至給自己的程式帶來一些安全隐患的bug。很多時候,對于isset,empty都認為差不多。是以開發時候,就沒有注 意,一段作為流程判斷時候,就出現bug問題了。

一、舉例說明

A.一個變量沒有定義,我們該怎麼樣去判斷呢?

[php]

<?php

#不存在$test 變量

$isset= isset($test)?"test is define!":"test is undefine!";

echo "isset:$issetrn";

$empty=!empty($test)?"test is define!":"test is undefine!";

echo "empty:$emptyrn";

$is_null=is_null($test)?"test is define!":"test is undefine!";

echo "is_null:$is_nullrn";

[/php]

測試結果是:

結果出來了:empty,isset首先都會檢查變量是否存在,然後對變量值進行檢測。而is_null 隻是直接檢查變量值,是否為null,是以如果變量未定義就會出現錯誤!

B、看下各自接收的參數是什麼?

isset函數參數:

<?php

$test=100;

echo isset($test),isset(100),$isset($b=100);

<br />

<b>Parse error</b>:  parse error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '$' in <b>PHPDocument3</b> on line <b>3</b><br />

empty函數參數:

<?php

$test=100;

echo empty($test),empty(100),empty($b=100);

<br />

<b>Parse error</b>:  parse error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '$' in <b>PHPDocument3</b> on line <b>3</b><br />

is_null函數參數:

<?php

$test=100;

echo is_null($test),is_null(100),is_null($b=100);

運作結果:沒有任何錯誤。

比較結果出來了:empty,isset輸入參數必須是一個變量(php變量是 以$字元開頭的),而is_null輸入參數隻要是能夠有傳回值就可以。(常量,變量,表達式等)。在php手冊裡面,對于他們解析 是:empty,isset 是一個語言結構而非函數,是以它無法被變量函數調用。

二、概括總結isset,empty,is_null差別:

剛才介紹的:檢查變量,以及參數類型,這個是這3個函數不同之處的基礎,也是最容易被忽視的。看到網上有很多對這個3個函數進行比較文章。很少涉及這些。下面我要說的,是在都檢查已存在變量情況下,不同之處。

執行個體:

[php]

<?php

$a=100;

$b="";

$c=null;

//isset檢查

echo "isset","$a=$a",isset($a)?"define":"undefine","rn";

echo "isset","$b=$b",isset($b)?"define":"undefine","rn";

echo "isset","$c=$c",isset($c)?"define":"undefine","rn";

unset($b);

echo "isset","$b",isset($b)?"define":"undefine","rn";

$b=0;

echo "rnrn";

//empty檢查

echo "empty","$a=$a",!empty($a)?"no empty":"empty","rn";

echo "empty","$b=$b",!empty($b)?"no empty":"empty","rn";

echo "empty","$c=$c",!empty($c)?"no empty":"empty","rn";

unset($b);

echo "empty","$b",!empty($b)?"no empty":"empty","rn";

$b=0;

echo "rnrn";

//is_null檢查

echo "is_null","$a=$a",!is_null($a)?"no null":"null","rn";

echo "is_null","$b=$b",!is_null($b)?"no null":"null","rn";

echo "is_null","$c=$c",!is_null($c)?"no null":"null","rn";

unset($b);

echo "is_null","$b",is_null($b)?"no null":"null","rn";

[/php]

通過上面這個簡單測試,我們可以大體知道,當一個變量存在情況下:isset,empty,is_null檢測,得到值情況了。上面沒有舉例更多變量。其實測試發現:

empty

如果 變量 是非空或非零的值,則 empty() 傳回 FALSE。換句話說,""、0、"0"、NULL、FALSE、array()、var $var、未定義; 以及沒有任何屬性的對象都将被認為是空的,如果 var 為空,則傳回 TRUE。

isset

如果 變量 存在(非NULL)則傳回 TRUE,否則傳回 FALSE(包括未定義)。變量值設定為:null,傳回也是false;unset一個變量後,變量被取消了。注意,isset對于NULL值變量,特殊處理。

is_null

檢測傳入值【值,變量,表達式】是否是null,隻有一個變量定義了,且它的值是null,它才傳回TRUE . 其它都傳回 FALSE 【未定義變量傳入後會出錯!】.

疑問:怎麼樣判斷一個變量被設定了,并且值為NULL呢?

通過上面比較,估計大家與我一樣,會有這個問題浮現在腦海裡面。 檢測一個變量是否是null 可以用:is_null,但如果變量未定義用它檢測會出錯。是以,我們想到,檢測變量是否定義可以用:isset,但是如果一個變量值是:null, 則它會傳回false . 哈哈,這個問題怎麼樣解決呢?等待大家分享……