PHP為什麼empty可以訪問不存在的索引

2022-05-10 20:58:23 字數 2385 閱讀 2977

開始之前, 先丟擲問題:

$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函式的顏色不一樣. 而emptyecho是相同的顏色, 那不就是說他們倆是一類貨色麼. 再看一下:

有沒有發現什麼?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的時候,issetfalse. 而array_key_exists函式返true. 明白了...

你要問我怎麼判斷是函式還是語言構造器, 編譯器顯示的顏色已經很好的提示你了.

如果你用的編輯器提示並不完善, 那麼將名字傳給function_exists看一下就行了, 如果不是函式, 又能呼叫, 那自然就是後者了.

之前被這個問題困擾過幾天, 今天下定決心一定要研究研究, 還行, 找到了... 簡單了解一下, 也算解了心中的小困惑. 是我小看了empty老兄, 一直以為它只是乙個小小的函式, 沒想到竟然是關鍵字, 失敬失敬.

對了, 再悄悄告訴你, php 中, 系統函式是可以被重新定義的, 只要你寫乙個同名函式就行, 但是關鍵字這幾個老兄不吃這一套哦.

金為什麼可以生水?水為什麼可以生木?

五行相生,金生水 水生木 木生火 火生土 土生金,在現代人看來,有些不可理解,例如 金為什麼可以生水?水為什麼可以生木?同理,五行相剋,金剋木 木剋土 土剋水 水剋火 火剋金當中,木剋土 土剋水之類,也有點不好理解,似乎與常識有些格格不入。其實,一切產生於古代的文化,都必須用那個時代的常識或理念來解...

機器為什麼可以學習

機器學習 人工智慧炙手可熱,但是機器到底為什麼可以學習呢?本文將從霍夫丁不等式講到vc維,機器學習的原因所在。機器什麼時候可以學習 機器怎麼學習 如何讓機器學得更好總結 機器學習乍聽之下很厲害,這時候人就會想,這乙個普普通通的死板的機器,怎麼會學習呢?很容易地,人們舉了個簡單的問題 如下圖 x,y,...

為什麼無法訪問mysql mysql為什麼無法訪問

mysql無法訪問有兩種情況 乙個是mysql沒有分配許可權,使用grant語句分配訪問許可權即可格式 grant 許可權 on 資料庫名.表名 使用者 登入主機 identified by 使用者密碼 grant select,update,insert,delete on to zhxia id...