PHP为什么empty可以访问不存在的索引
開始之前, 先拋出問題:
$arr = []; echo 'empty: ', PHP_EOL; var_dump(empty($arr['1'])); echo 'is_array: ', PHP_EOL; var_dump(is_array($arr['1']));這段代碼的運行結(jié)果:
你是否和我有過同樣的疑問? 同樣是函數(shù), 為什么empty訪問不存在的索引就不會報錯呢? 按理說哈, 函數(shù)調(diào)用的時候, 會將將參數(shù)傳值過去吧, 也就是說兩個函數(shù)的調(diào)用第一步, 都是要把$arr['1']這個內(nèi)容取出來吧, 那又為什么一個能拿出來一個拿不出來呢?
不懂就要問, 然后我就這個傳參的問題各種搜索, 也沒有找到想要的答案. 但是, 冥冥中我是感覺他們是有區(qū)別的, 你要問我為什么, 來:
有沒有發(fā)現(xiàn), 編譯器在顯示的時候, empty函數(shù)和is_array函數(shù)的顏色不一樣. 而empty和echo是相同的顏色, 那不就是說他們倆是一類貨色么. 再看一下:
有沒有發(fā)現(xiàn)什么? PHP中的關(guān)鍵字用的就是這個顏色. 我仿佛明白了些什么.
隨后, 我就去翻了翻官方文檔, 還真讓我發(fā)現(xiàn)了些許的端倪, 在empty函數(shù)的文檔下, 有這樣一段:
雖然我不知道語言構(gòu)造器是什么, 但是函數(shù)我知道啊. 而官方文檔中也提出了, empty不是一個函數(shù), 那么, 上面拿他當做函數(shù)來進行分析顯然就不對了.
語言構(gòu)造器
那么現(xiàn)在問題來了, 什么是語言構(gòu)造器呢? 簡單來說, 就是 PHP 所定義的那些關(guān)鍵字. 雖然用法看起來像函數(shù), 但是在調(diào)用的時候直接映射到預先定義好的一系列操作, 而不會像函數(shù)一樣進行傳參等等解析操作.
再看一個可以展示其區(qū)別的例子:
$isArrFun = 'is_array'; var_dump($isArrFun(2)); $empFun = 'empty'; var_dump($empFun(1));結(jié)果:
在第二次調(diào)用的時候, 報錯: 沒有empty方法. 是不是仿佛懂了些什么, 進一步驗證它并不是函數(shù).
既然語言構(gòu)造器是一些預定義操作, 那么大概率要比函數(shù)的調(diào)用更有效率. 所以, isset 要比array_key_exists更快. 剛剛想到這個問題的時候, 我還疑惑了一下, 既然有更有效率的方式, 那array_key_exists函數(shù)存在的意義是什么呢? 想了想, 看這段:
$arr = ['a' => null, ]; var_dump(isset($arr['a'])); var_dump(array_key_exists('a', $arr));當元素為null的時候, isset返false. 而array_key_exists函數(shù)返true. 明白了…
判斷
你要問我怎么判斷是函數(shù)還是語言構(gòu)造器, 編譯器顯示的顏色已經(jīng)很好的提示你了.
如果你用的編輯器提示并不完善, 那么將名字傳給function_exists 看一下就行了, 如果不是函數(shù), 又能調(diào)用, 那自然就是后者了.
之前被這個問題困擾過幾天, 今天下定決心一定要研究研究, 還行, 找到了… 簡單了解一下, 也算解了心中的小困惑. 是我小看了empty老兄, 一直以為它只是一個小小的函數(shù), 沒想到竟然是關(guān)鍵字, 失敬失敬.
對了, 再悄悄告訴你, PHP 中, 系統(tǒng)函數(shù)是可以被重新定義的, 只要你寫一個同名函數(shù)就行, 但是關(guān)鍵字這幾個老兄不吃這一套哦.
總結(jié)
以上是生活随笔為你收集整理的PHP为什么empty可以访问不存在的索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 23种设计模式之中介者模式
- 下一篇: 云星空计算机名访问不可以,03.PLM系