isset和is null的不同

2021-07-04 19:45:52 字數 3557 閱讀 1955

·        

作者: laruence()

·        

: ·        

今天有人問我

isset

和is_null

啥區別,

看手冊上講的話

, isset

和is_null

的功能幾乎完全

」相反的一樣

」..

是不是isset

就是乙個

is_null

的相反的別名?

誒, 要說區別

, 那還真的是很多~

一切的不同都是因為

: is_null

是函式,isset

是語句.

isset

是語句,

和echo,print一樣,

是php

本身的一種語言結構.

而is_null

是函式,

和我們一般的函式一樣

, 可以做為可變函式呼叫.

你也許會說

, 好了,好了

,我知道函式和語句的區別

, 但到底是

***什麼區別?

誒, 所謂語句

,語言結構

, 就是說

, 是語言本身支援的語句

, 識別符號.

比如, for, foreach, continue

等等,

它們在語法分析的時刻就被」抹掉

」(邏輯上替代了)了

. 讓我們看看

isset

這個語句在語法分析的過程中

, 是如何被」抹掉

」的.

1. 首先

, 在詞法分析的時候

, isset

會被識別為

t_isset

識別符號.

2. 而在語法分析階段

, isset($var)

這個指令

, 會被分析成一條

opcode:zend_isset_isempty_vars.

你可以理解

isset就想c

語言裡面的巨集

, 在編譯

/執行之前已經被展開了.

因為這個

,所以在表現上

,會有如下的不同:

因為is_null

是函式,

所以它可以通過如下方式呼叫:

1.       

<?php

2.       

$var

= null;

3.       

$func

="is_null";

4.       

$func

($var);

5.       

?> 而

, isset

因為是語句

, 所以不能這樣呼叫.

因為is_null

是函式,

所以它可以接受函式返回值做為引數, 而

isset不行(

當然,

如果php

想支援,

其實也是可以的

, 只不過就要增加編譯階段的複雜度了):

1.       

<?php

2.       

is_null

(intval

("0x45"

));

3.       

//ok

4.       

isset

(intval

("0x45"

));

5.       

//php fatal error: can't use function return value in write context

6.       

is_null

(null);

7.       

//ok

8.       

isset

(null);

9.       

//php parse error: syntax error

10.    

?>

說了這麼多

isset

的缺點了

, 說點它的優點吧:

因為isset

是語句,

所以它快!

在一千萬次的簡單檢測語句迴圈中

, 對比結果如下:

1.       

<?php

2.       $a=

"laruence":

3.       

isset($a

);//

用時: 1.15s

4.       

is_null($a

);//

用時: 3.89s

5.       

?> 因為

isset

叫做isset,

所以它在檢測未定義變數的時候

, 不會產生

notice:

1.       

<?php

2.       

isset

($laruence);

3.       

//ok

4.       

is_null

($laruence);

5.       

//php notice: undefined variable: laruence

6.       

?> 那麼

, 對於什麼時候用

isset

什麼時候用

is_null,

我有什麼建議呢?

誒, 我的建議是

, 用函式做函式應該做的事情

~, 聽起來象廢話?

isset=> is set? =>

變數有沒有被賦值(宣告

) is_null=> is null? =>

變數為null麼?

另外,如果要用

is_null,

我建議使用

「=== null」

來代替,

它不僅語義和

is_null一致,

結果一致

,速度還和

isset

差不多:

在一千萬次的簡單檢測語句迴圈中

, 對比結果如下:

1.       

<?php

2.       $a=

"laruence":

3.       

isset($a

);//

用時: 1.15s

4.       

is_null($a

);//

用時: 3.88s

5.       

$a===

null;

//用時

: 1.22s

6.       

?>

isset和is null的不同

作者 laruence 今天有人問我 isset 和is null 啥區別,看手冊上講的話 isset 和is null 的功能幾乎完全 相反的一樣 是不是isset 就是乙個 is null 的相反的別名?誒,要說區別 那還真的是很多 一切的不同都是因為 is null 是函式,isset 是語句...

empty isset和is null的比較

empty,isset首先都會檢查變數是否存在,然後對變數值進行檢測。而is null 只是直接檢查變數值,是否為null,因此如果變數未定義就會出現錯誤!empty false。換句話說,0 0 null false array var var 未定義 以及沒有任何屬性的物件都將被認為是空的。is...

empty isset和is null的比較

empty,isset首先都會檢查變數是否存在,然後對變數值進行檢測。而is null 只是直接檢查變數值,是否為null,因此如果變數未定義就會出現錯誤!empty false。換句話說,0 0 null false array var var 未定義 以及沒有任何屬性的物件都將被認為是空的。is...