php中empty函數和isset函數經常會用到,而且兩者出現的頻率不低,兩個有相似的地方,但實質上有很大的區別,嚴格區分兩者非常重要。
empty函數用來檢測變數是否為空白,而isset函數用來檢測函數是否設定且是不是為null,這是兩者重要的區別,可能光說還不能很好的理解,下面來看例子。
首先來看isset函數
isset的官方解釋:determine if a variable is set and is not null //判斷一個變數是否被設定同時變數不為null
bool isset(mixed $var,[ ,mixed $... ] );
範例:
<?php$str1;$str2="";$str3="hello";var_dump(isset($str0));var_dump(isset($str1));var_dump(isset($str2));var_dump(isset($str3));
得到的結果是 false false true true
來分析一下:
isset官方手冊寫的: bool isset(mixed $val [,mixed $var...]);
第一個$str0沒有設定,isset檢測的結果沒有設定返回false,這個一般都沒有疑問。
第二個$str1設定了,但是沒有賦值,這種情況$str1為null,雖然isset檢測結果是設定了該變數,但是由於值為null,因此也為false,這裡是容易出錯的地方,因為很多人認為isset只檢測變數是否設定了,既然設定了,肯定就為true,這是錯誤的,即便變數設定了,如果為null的話也是為false的。
第三個檢測結果是存在,而變數$str2為空白值,因此isset結果是true,第四個同理,因此也是true。
可以看出isset檢測的是變數是否存在,且是不是為null,如果沒有設定或者值為null則為false,不是則為true。
isset可以進行多個變數的檢測
如果是多個變數的檢測,那麼必須所有的變數都存在且不為null的時候才能為true,否則為false
例如上面的的例子的$str1和$st2一起使用isset檢測,則為false,而$str2和$str3則為true。
unset過的變數,isset為false。
下面來看看empty函數
官方手冊的解釋:determine whether a variable is empty //判斷一個變數是不是為空白值
bool empty(mixed $val)
範例:
<?php$str1=null;$str2='';$str3=0;$str4=false;$str5='abc';var_dump(empty($str0));var_dump(empty($str1));var_dump(empty($str2));var_dump(empty($str3));var_dump(empty($str4));var_dump(empty($str5));
得到的結果會是:true true true true true false
這裡可能很容易產生誤解,因為上面除了最後的$str5的變數為字串'abc'外,其他都顯示為true,也就是empty判斷其為空白,下面來看看官方對empty的詳細描述:
determine whether a variable is considered to be empty,A variable is considered if it does not exist or if it's value equals FALSE.
empty does not generate a warning if the variable does not exist.
上面說的很明白,empty檢測變數是值是否為空白,如果不存在或者值為false則empty返回true,並且如果變數不存在,empty函數不會產生警告
從上面的解釋就能看出上面的範例為什麼結果是這樣
$str0不存在,empty函數不會產生錯誤,變數值為空白,所以返回true,
$str1存在,但值為null,因此被強制轉換為bool值false,同上面的解釋,如果值為false則為true,
$str2存在,但值為空白,轉換bool類型為false,返回true,
$str3存在,但值為0,0被轉換成bool類型,為false,同上面的解釋,如果值為false則為true,
$str4存在,但值為false,因此得到true,
$str5存在,值為字串abc,不符合值為空白或者值為false,因此empty函數返回false。
從這裡可以觀察到,其實empty函數會對檢測的變數進行判斷,判斷的過程中會對變數的值進行檢測,如果是bool值,根據bool值判斷,如果不是bool值則進行強制轉換為bool值再進一步進行判斷。因此如果該變數的值轉換成bool值時為false,則empty函數返回true,如果該變數的值轉換成true,empty函數返回false。
詳細解讀如下:
如果變數不存在,empty函數將該變數強制轉換bool類型,轉換成false,empty函數返回true。
如果變數存在,但為null、0,、false、array()等強制轉換bool類型過程中會得到false的變數,empty函數返回true。
如果變數存在,變數的值轉換bool類型為true,則empty函數返回false。
這樣來解讀empty函數就清晰多了。
isset和empty對比
從上面的解讀可以看出,isset()為false的情況,empty()得到的肯定為true。
isset適合於檢測一個變數是否被設定了且是不是被初始化,如果變數沒有被設定,或者設定了沒有進行初始化則返回false,否則返回true。
而empty則適合檢測一個變數是否進行了賦值且是不是初始預設值,如果該變數不存在或者該值是初始化的預設值,則認為該變數為空白,返回true,否則返回false。由於php是不指定變數類型的,所以empty的使用尤其要小心,它可能由於使用方法不對,得到我們不想要的結果。
例如你想知道一個字串類型的變數是不是存在,且是不是空值,如果該變數有賦值,但賦值的內容就是字串的0的話,用empty是得不到想要的答案的,因為empty會自動認為字串0是int類型的初始化值的預設值0,這個結論是錯誤的,這種情況應該使用isset進行判斷該變數是否設定了,且是不是初始化,然後再判斷該變數是不是字串的初始化預設值' ',這樣才能得到正確的結果。