日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP为什么empty可以访问不存在的索引

發布時間:2024/8/23 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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可以访问不存在的索引的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。