解析isset與is_null的區(qū)別
isset和is_null啥區(qū)別,
看手冊(cè)上講的話, isset和is_null的功能幾乎完全”相反的一樣”..
是不是isset就是一個(gè)is_null的相反的別名?
誒, 要說(shuō)區(qū)別, 那還真的是很多~
一切的不同都是因?yàn)? is_null是函數(shù), isset是語(yǔ)句.
isset是語(yǔ)句, 和echo, print一樣, 是PHP本身的一種語(yǔ)言結(jié)構(gòu).
而is_null是函數(shù), 和我們一般的函數(shù)一樣, 可以做為可變函數(shù)調(diào)用.
你也許會(huì)說(shuō), 好了,好了,我知道函數(shù)和語(yǔ)句的區(qū)別, 但到底是TMD什么區(qū)別?
誒, 所謂語(yǔ)句,語(yǔ)言結(jié)構(gòu), 就是說(shuō), 是語(yǔ)言本身支持的語(yǔ)句, 標(biāo)識(shí)符.
比如, for, foreach, continue 等等, 它們?cè)谡Z(yǔ)法分析的時(shí)刻就被”抹掉”(邏輯上替代了)了.
讓我們看看isset這個(gè)語(yǔ)句在語(yǔ)法分析的過(guò)程中, 是如何被”抹掉”的.
1. 首先, 在詞法分析的時(shí)候, isset會(huì)被識(shí)別為T_ISSET標(biāo)識(shí)符.
2. 而在語(yǔ)法分析階段, isset($var)這個(gè)指令, 會(huì)被分析成一條Opcode:ZEND_ISSET_ISEMPTY_VARS.
你可以理解isset就想C語(yǔ)言里面的宏, 在編譯/執(zhí)行之前已經(jīng)被展開了.
因?yàn)檫@個(gè), 所以在表現(xiàn)上, 會(huì)有如下的不同:
因?yàn)閕s_null是函數(shù), 所以它可以通過(guò)如下方式調(diào)用:
<?php
$var = NULL;
$func = "is_null";
$func($var);
?>
而, isset因?yàn)槭钦Z(yǔ)句, 所以不能這樣調(diào)用.
因?yàn)閕s_null是函數(shù), 所以它可以接受函數(shù)返回值做為參數(shù), 而isset不行(當(dāng)然, 如果PHP想支持, 其實(shí)也是可以的, 只不過(guò)就要增加編譯階段的復(fù)雜度了):
<?php
is_null(intval("0x45"));
//OK
isset(intval("0x45"));
//PHP Fatal error: Can't use function return value in write context
is_null(NULL);
//OK
isset(NULL);
//PHP Parse error: syntax error
?>
說(shuō)了這么多isset的缺點(diǎn)了, 說(shuō)點(diǎn)它的優(yōu)點(diǎn)吧:
因?yàn)閕sset是語(yǔ)句, 所以它快!
在一千萬(wàn)次的簡(jiǎn)單檢測(cè)語(yǔ)句循環(huán)中, 對(duì)比結(jié)果如下:
<?php
$a="laruence":
isset($a); //用時(shí): 1.15s
is_null($a); //用時(shí): 3.89s
?>
因?yàn)閕sset叫做isset, 所以它在檢測(cè)未定義變量的時(shí)候, 不會(huì)產(chǎn)生NOTICE:
<?php
isset($laruence);
//OK
is_null($laruence);
//PHP Notice: Undefined variable: laruence
?>
那么, 對(duì)于什么時(shí)候用isset什么時(shí)候用is_null, 我有什么建議呢?
誒, 我的建議是, 用函數(shù)做函數(shù)應(yīng)該做的事情~, 聽起來(lái)象廢話?
isset => is set? => 變量有沒有被賦值(聲明)
is_null => is null? => 變量為NULL么?
另外, 如果要用is_null, 我建議使用 “=== NULL” 來(lái)代替, 它不僅語(yǔ)義和is_null一致, 結(jié)果一致, 速度還和isset差不多:
在一千萬(wàn)次的簡(jiǎn)單檢測(cè)語(yǔ)句循環(huán)中, 對(duì)比結(jié)果如下:
<?php
$a="laruence":
isset($a); //用時(shí): 1.15s
is_null($a); //用時(shí): 3.88s
$a===NULL; //用時(shí): 1.22s
?>
相關(guān)文章
PHP 獲取文件路徑(靈活應(yīng)用__FILE__)
__FILE__ ,是返回文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個(gè)絕對(duì)路徑,而在此之前的版本有時(shí)會(huì)包含一個(gè)相對(duì)路徑2013-02-02php實(shí)現(xiàn)轉(zhuǎn)換html格式為文本格式的方法
這篇文章主要介紹了php實(shí)現(xiàn)轉(zhuǎn)換html格式為文本格式的方法,通過(guò)一個(gè)自定義函數(shù)實(shí)現(xiàn)針對(duì)HTML標(biāo)簽的過(guò)濾,涉及php正則替換的相關(guān)操作技巧,需要的朋友可以參考下2016-05-05PHP基于工廠模式實(shí)現(xiàn)的計(jì)算器實(shí)例
這篇文章主要介紹了PHP基于工廠模式實(shí)現(xiàn)的計(jì)算器,實(shí)例分析了php工廠模式的實(shí)現(xiàn)原理與應(yīng)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07php實(shí)現(xiàn)模擬登陸方正教務(wù)系統(tǒng)抓取課表
這篇文章主要介紹了php實(shí)現(xiàn)模擬登陸方正教務(wù)系統(tǒng)抓取課表的相關(guān)資料,需要的朋友可以參考下2015-05-05php簡(jiǎn)單靜態(tài)頁(yè)生成過(guò)程
一直用smarty的cache,但感覺還是要自己做一個(gè),才有感覺。網(wǎng)上有很多牛人的功能比較完備,打算先自己搞簡(jiǎn)單的再慢慢豐滿。這兩天做了一個(gè)比較簡(jiǎn)單的,在hi.baidu.net/alex_wang58記錄一下。2008-03-03PHP在不同頁(yè)面間傳遞Json數(shù)據(jù)示例代碼
本文為大家介紹下PHP如何在不同頁(yè)面間傳遞Json數(shù)據(jù),具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助2013-06-06php計(jì)算整個(gè)mysql數(shù)據(jù)庫(kù)大小的方法
這篇文章主要介紹了php計(jì)算整個(gè)mysql數(shù)據(jù)庫(kù)大小的方法,涉及php操作MySQL數(shù)據(jù)庫(kù)的相關(guān)技巧,需要的朋友可以參考下2015-06-06