isset、empty和is_null
做php開發時候,想必在使用:empty,isset,is_null 這幾個函數時候,遇到一些問題。甚至給自己的程序帶來一些安全隱患的bug。很多時候,對於isset,empty都認為差不多。因此開發時候,就沒有註意,一段作為流程判斷時候,就出現bug問題了。
一、舉例說明
A.一個變量沒有定義,我們該怎麽樣去判斷呢?
1 2 3 4 5 6 7 8 9 10 11 <?php
#不存在
$test
變量
$isset
= isset(
$test
)?
"test is define!"
:
"test is undefine!"
;
echo
"isset:$isset\r\n"
;
$empty
=!
empty
(
$test
)?
"test is define!"
:
"test is undefine!"
;
echo
"empty:$empty\r\n"
;
$is_null
=
is_null
(
$test
)?
"test is define!"
:
"test is undefine!"
;
echo
"is_null:$is_null\r\n"
;
測試結果是:
結果出來了: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個函數進行比較文章。很少涉及這些。下面我要說的,是在都檢查已存在變量情況下,不同之處。
實例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <?php
$a
=100;
$b
=
""
;
$c
=null;
//isset檢查
echo
"isset"
,
"\$a=$a"
,isset(
$a
)?
"define"
:
"undefine"
,
"\r\n"
;
echo
"isset"
,
"\$b=$b"
,isset(
$b
)?
"define"
:
"undefine"
,
"\r\n"
;
echo
"isset"
,
"\$c=$c"
,isset(
$c
)?
"define"
:
"undefine"
,
"\r\n"
;
unset(
$b
);
echo
"isset"
,
"\$b"
,isset(
$b
)?
"define"
:
"undefine"
,
"\r\n"
;
$b
=0;
echo
"\r\n\r\n"
;
//empty檢查
echo
"empty"
,
"\$a=$a"
,!
empty
(
$a
)?
"no empty"
:
"empty"
,
"\r\n"
;
echo
"empty"
,
"\$b=$b"
,!
empty
(
$b
)?
"no empty"
:
"empty"
,
"\r\n"
;
echo
"empty"
,
"\$c=$c"
,!
empty
(
$c
)?
"no empty"
:
"empty"
,
"\r\n"
;
unset(
$b
);
echo
"empty"
,
"\$b"
,!
empty
(
$b
)?
"no empty"
:
"empty"
,
"\r\n"
;
$b
=0;
echo
"\r\n\r\n"
;
//is_null檢查
echo
"is_null"
,
"\$a=$a"
,!
is_null
(
$a
)?
"no null"
:
"null"
,
"\r\n"
;
echo
"is_null"
,
"\$b=$b"
,!
is_null
(
$b
)?
"no null"
:
"null"
,
"\r\n"
;
echo
"is_null"
,
"\$c=$c"
,!
is_null
(
$c
)?
"no null"
:
"null"
,
"\r\n"
;
unset(
$b
);
echo
"is_null"
,
"\$b"
,
is_null
(
$b
)?
"no null"
:
"null"
,
"\r\n"
;
通過上面這個簡單測試,我們可以大體知道,當一個變量存在情況下: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 . 哈哈,這個問題怎麽樣解決呢?等待大家分享……
isset、empty和is_null