開始之前, 先丟擲問題:
$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 中, 系統函式是可以被重新定義的, 只要你寫乙個同名函式就行, 但是關鍵字這幾個老兄不吃這一套哦.
金為什麼可以生水?水為什麼可以生木?
五行相生,金生水 水生木 木生火 火生土 土生金,在現代人看來,有些不可理解,例如 金為什麼可以生水?水為什麼可以生木?同理,五行相剋,金剋木 木剋土 土剋水 水剋火 火剋金當中,木剋土 土剋水之類,也有點不好理解,似乎與常識有些格格不入。其實,一切產生於古代的文化,都必須用那個時代的常識或理念來解...
機器為什麼可以學習
機器學習 人工智慧炙手可熱,但是機器到底為什麼可以學習呢?本文將從霍夫丁不等式講到vc維,機器學習的原因所在。機器什麼時候可以學習 機器怎麼學習 如何讓機器學得更好總結 機器學習乍聽之下很厲害,這時候人就會想,這乙個普普通通的死板的機器,怎麼會學習呢?很容易地,人們舉了個簡單的問題 如下圖 x,y,...
為什麼無法訪問mysql mysql為什麼無法訪問
mysql無法訪問有兩種情況 乙個是mysql沒有分配許可權,使用grant語句分配訪問許可權即可格式 grant 許可權 on 資料庫名.表名 使用者 登入主機 identified by 使用者密碼 grant select,update,insert,delete on to zhxia id...