PHP判斷變量是否存在及函數isset() 、empty()與is_null的區別

一、舉例說明

A.如何判斷一個變量是否定義?

<?php
// 假設不存在$test 變量

if (isset($test))
{
	echo '$test 已經set', '<br/>';
}
else
{
	echo '$test 沒有set', '<br/>';
}

if (empty($test))
{
	echo '$test 爲empty', '<br/>';
}
else
{
	echo '$test 不爲empty', '<br/>';
}

if (is_null($test))
{
	echo '$test 爲null', '<br/>';
}
else
{
	echo '$test 不爲null', '<br/>';
}

if ($test)
{
	echo '$test值爲' . $test, '<br/>';
}
else
{
	echo '$test沒有值', '<br/>';
}

輸出結果:

結果表明:

1、當變量未定義時,is_null()和“參數本身”是不允許作爲參數判斷的,會報Notice警告錯誤;

2、empty,isset首先都會檢查變量是否存在,然後對變量值進行檢測。而is_null 和 “參數本身”只是直接檢查變量值,是否爲null,因此如果變量未定義就會出現錯誤!

 

3、isset():僅當null和未定義,返回false;

4、empty():""、0、"0"、NULL、FALSE、array(),未定義,均返回false;

5、is_null():僅判斷是否爲null,未定義 報警告;

6、變量本身作爲參數,與empty()一致,但接受未定義變量時,報警告;

 

B.對空值的判斷比較?

<?php
// 預定義變量數組:空字符,字符0,數組0,null,布爾false,空數組
$arrVars = array('', '0', 0, null, false, array());

foreach ($arrVars as $value)
{
	echo '<br>傳入值爲:' . $value . '<br>';
	if (!isset($value))
	{
		echo 'isset()==false<br>';
	}

	if (empty($value))
	{
		echo 'empty()==true<br>';
	}

	if (!$value)
	{
		echo 'self==false<br>';
	}

	if (is_null($value))
	{
		echo 'is_null()==true<br>';
	}
}
輸出結果:
傳入值爲:
empty()==true
self==false

傳入值爲:0
empty()==true
self==false

傳入值爲:0
empty()==true
self==false

傳入值爲:
isset()==false
empty()==true
self==false
is_null()==true

傳入值爲:
empty()==true
self==false

傳入值爲:Array
empty()==true
self==false

結果表明:

""、0、"0"、NULL、FALSE、array()這幾個中,empty()和“變量本身作爲參數”結果一致,均作爲“空”來處理,而isset()和is_null ()僅當是null時,才作爲“空”來處理(值得注意的是false並不會被認爲是空)

 

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

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區別:

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 【未定義變量傳入後會出錯!】。

 

empty(), is_null(), isset()真值表(區別)

 

三、isset詳細介紹(應用場景舉例)

1、isset()對PHP參數判斷

您可以使用 PHP isset() 來判斷一個參數是否被定義,注意如果該參數爲空,或者"\n"(NULL字節)使用 PHP isset() 判斷之後,都會爲TRUE。

<?php
$var = ''; // 這裏初始參數$var='';
$var0 = FALSE; // 這裏初始參數爲布爾FALSE
$var2 = NULL;  // 這裏定義$var2=NULL,用isset()判斷返回FALSE
$var3 = "\0"; // 這裏是NULL字節,用isset()判斷,返回TRUE,不同於NULL常數
$var4 = "blog.snsgou.com"; // 這裏定義會在下面給unset掉

if (isset($var))
{
	echo '參數$var已經設定,且值不爲NULL';
}
// 參數$var已經賦值,而且值爲$var='',所以會輸出“參數$var已經設定”


if (isset($var0))
{
	echo '參數$var0已經設定,且值不爲NULL';
}
// 參數$var0已經賦值,而且值爲$var=FALSE,所以會輸出“參數$var已經設定”


if (isset($vget))
{
	echo '參數$vget已經設定,且值不爲NULL';
}
// 參數$vget根本就沒有被提及過,isset($vget)返回FALSE,不會輸出


if (isset($var2))
{
	echo '參數$var2已經設定,且值不爲NULL';
}
// 這裏是$var2雖然被設定了,但是$var2=NULL,所以isset($var2)返回FALSE,不會輸出


if (isset($var3))
{
	echo '參數$var3已經設定,且值不爲NULL';
}
// 參數$var3 雖然\0 就是代表NULL字節,但是這個不是常數NULL,所以$isset("\0")返回TRUE,會輸出


unset($var4); // 這裏給$var4 釋放掉了
if (isset($var4))
{
	echo '參數$var4已經設定,且值不爲NULL';
}
// 雖然開始已經定義$var4,而且還不爲NULL,但是後來又給 unset() 掉了,所以不會輸出。

2、PHP isset() 對數組的判斷

在使用PHP數組的時候,需要判斷數組的某個值是否存在也可以使用 PHP isset() 函數。

<?php
$V => array(
	'aa' => 'blog.snsgou.com',
	'bb' => array(
		'file' => 'file.snsgou.com',
		'img' => 'img.snsgou.com',
		'hosts' => array(
			'blog' => 'blog.snsgou.com',
			'res' => 'res.snsgou.com'
		)
	)
);

// var_dump用於輸出TRUE 或 FALSE

var_dump(isset($V['aa']));
// 數組$V 的$V['aa'] ='blog.snsgou.com'已經存在,所以輸出TRUE

var_dump(isset($V['bb']['file']));
//$V['bb']['file'] = 'file.snsgou.com' 所以輸出 TRUE

var_dump(isset($V['bb']['hosts']['blog']));
// $V['bb']['hosts']['blog']='blog.snsgou.com'所以輸出TRUE

var_dump(isset($V['bb']['hosts']['sh']));
//根據數組,根本就沒有設定該項,所以輸出FALSE
?>

3、PHP isset()對參數判斷

很多時候我們需要對多個參數進行判斷,可以使用isset($A)&&isset($B)……來判斷這些參數是不是都已經設定了,而且都不爲NULL,對此您可以使用isset()多參數來判斷是不是都設定了。

<?php
isset($v1)&&isset($v2)&&isset($v3)……
// 等價於 
isset($v1,$v2,$v3……)
?>

使用isset()判斷多個參數,需要所有參數都被設定,且不爲NULL,只要其中有一個參數沒有被設定過,或者爲NULL,那麼整個isset()就爲FALSE。

4、PHP isset()判斷$_POST、$_GET、$_REQUEST等值

用isset() 或者empty() 判斷通過表單傳遞來的參數是isset() 最常見的用法。

<?php
if (isset($_POST['from']) && 'snsgou.com' == $_POST['from'])
{
	echo '網站通過POST傳遞的來源是snsgou.com';
}
根據上面我們可以用isset判斷多參數,在對錶單傳遞來的值進行判斷就最方便了。
<?php
// 表單傳遞來user用戶名和 pass必須同時存在才能執行
if (isset($_POST['user'], $_POST['pass']))
{
	$user = $_POST['user'];
	$pass = $_POST['pass'];
	echo '您填寫的用戶名是:', $user, ';密碼是:', $pass;
}

5、PHP isset($var{字符串長度}) 判斷字符串長度

用PHP判斷字符串是否存在或者判斷字符串長度是否超過某一數字或者判斷字符串長度是否爲空一般使用strlen(),但是其實使用isset()性能更優越。

<?php
// 三元,等同於 if (isset($_POST['from'])) { $var = $_POST['from'];} else {$weiget = '';}

$var = isset($_POST['from']) ? $_POST['from'] : '';

// 判斷$var存在,且字符串長度大於0
/* 菜鳥寫法  
if (strlen($var) > 0) 
{
	echo '$var子符長度大於0';
}
*/

// 性能更優越的寫法,判斷$var第1個字符是否設定了
if (isset($var{1})) 
{
	echo '$var字符長度大於0';
}<pre name="code" class="php"><?php
// $_POST['from'] 傳遞來的是一個網址,據此我們可以知道,這個值一定不爲0和布爾,只能是字符串,或者空字符串,或者不存在

/* 下面寫法比較常見,但是需要判斷兩次
if (isset($_POST['from']) && isset($_POST['from']{1})) 
{
	echo '$weigeti子符長度大於0';
}
*/

// 下面用!empty() 只需要判斷一次,更加高效
if (!empty($_POST['from'])) 
{
	echo '傳遞的from存在且不爲空、0等';
}


6、PHP isset() 與 PHP empty() 的區別

很多人都拿 PHP isset() 和 PHP empty()進行比較,不過得出的結論一般都是 PHP isset() 判斷這個參數是否存在,且不爲NULL,即使用 PHP isset() 判斷空值、0、布爾值(TRUE/FALSE)都是TRUE,而且 PHP isset() 還可以對數組進行判斷。

而 PHP empty(),若變量不存在,或者變量存在且其值爲""、0、"0"、NULL、FALSE、array()、var $var; 以及沒有任何屬性的對象,則返回 TURE。

那麼!empty(),就是變量存在,且值不爲""、0、"0"、NULL、FALSE、array()以及var $var;

<?php
// $_POST['from'] 傳遞來的是一個網址,據此我們可以知道,這個值一定不爲0和布爾,只能是字符串,或者空字符串,或者不存在

/* 下面寫法比較常見,但是需要判斷兩次
if (isset($_POST['from']) && isset($_POST['from']{1})) 
{
	echo '$weigeti子符長度大於0';
}
*/

// 下面用!empty() 只需要判斷一次,更加高效
if (!empty($_POST['from'])) 
{
	echo '傳遞的from存在且不爲空、0等';
}

雖然有時候用!empty()判斷傳遞來的$_GET、$_POST 性能更優越,但是並不是能完全代替isset()使用,如果傳遞的值允許包含0、'0'或者空的時候,就不能使用!empty()判斷了,否則即使傳遞過來了0、'0'都會被當作沒有傳遞任何值過來。

而對於可以確定傳遞過來的值一定不爲0、'0'、空的時候,如用戶名、密碼等,使用!empty() 性能更優越。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章