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