php isset函數對比empty函數之間的區別及其使用方法____函數

來源:互聯網
上載者:User

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進行判斷該變數是否設定了,且是不是初始化,然後再判斷該變數是不是字串的初始化預設值' ',這樣才能得到正確的結果。















相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.