PHP instanceof 使用注意事項(xiàng)

在查看laravel源碼的時(shí)候擅笔,看到有如下一段代碼:

    /**
     * Get the registered service provider instance if it exists.
     *
     * @param  \Illuminate\Support\ServiceProvider|string  $provider
     * @return \Illuminate\Support\ServiceProvider|null
     */
    public function getProvider($provider)
    {
        $name = is_string($provider) ? $provider : get_class($provider);

        return Arr::first($this->serviceProviders, function ($key, $value) use ($name) {
            return $value instanceof $name;
        });
    }

當(dāng)時(shí)就有點(diǎn)困惑,然后在tinker連就敲了一下驗(yàn)證汹押,結(jié)果陷入更大的迷惑中矿筝。。棚贾。
下棉代碼是這個(gè)問(wèn)題的嘗試的心路歷程:

>>> use App\Model\Account;
=> null
>>> $account = new Account();
=> App\Model\Account {#1607}
>>> $account instanceof 'App\Model\Account';
PHP Parse error: Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING on line 1
>>> $account instanceof App\Model\Account;
=> true
>>> $a = 'abc';
=> "abc"
>>> $a instanceof 'abc';
PHP Parse error: Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING on line 1
>>> $account instanceof 'App\Model\Account';
PHP Parse error: Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING on line 1
>>> get_class($a);
PHP warning:  get_class() expects parameter 1 to be object, string given on line 1
>>> get_class($account);
=> "App\Model\Account"
>>> $name = get_class($account);
=> "App\Model\Account"
>>> $account instanceof $name;
=> true
>>> gettype($name);
=> "string"
>>> $account instanceof "App\Model\Account";
PHP Parse error: Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING on line 1
>>> $account instanceof Account;
=> true
>>> $temp = "App\Model\Account";
=> "App\Model\Account"
>>> $account instanceof $temp;
=> true


其實(shí)上面問(wèn)題的核心是instanceof的用法問(wèn)題窖维,在網(wǎng)上已經(jīng)有這樣的討論,我將其粘貼出來(lái):

class MyClass {
 
    public $bar;
 
    public function __construct() {
        $this->bar = "Hello World";
    }
 
    public function foo() {
        return $this->bar;
    }
}
 
$a = new MyClass;
$b = new MyClass;
 
if($a instanceof get_class($b)) {
    echo "Is instance";
} else {
    echo "Is NOT instance";
}

//輸出
Parse error: syntax error, unexpected '(' in /usercode/file.php on line 19

但是如果妙痹,你這樣改寫:

$x = get_class($b); 

if($a instanceof $x) { 
    echo "Is instance"; 
} else { 
    echo "Is NOT instance"; 
} 

//輸出
Is instance

答案是因?yàn)閕nstanceof并不是函數(shù)铸史,只能接受對(duì)象(字面量的,不是字符串)或者變量怯伊。如果后面接的是函數(shù)或者是字符串(字面量的)琳轿,那肯定是會(huì)報(bào)錯(cuò)的,本身語(yǔ)法就會(huì)有問(wèn)題。

原討論的回答如下:

Logically that would be the case, and if instanceof were a function then it would be the actual case. However, instanceof is a language construct operator, not a normal function and for that reason it doesn't play by the same rules.
instanceof does not accept expressions like a normal function would, and because calling a function like get_class is an expression you can't use it with instanceof.
instanceof accepts only two types of arguments. Either a class name (literal, not as a string) or a variable containing a string that is the class name.
Other language constructs like empty and isset function in exactly the same fashion (ie: you can't pass an expression to them either).
Note that you can use the is_a() function if you want to pass the class name as an expression.


參考網(wǎng)站:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崭篡,一起剝皮案震驚了整個(gè)濱河市挪哄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌媚送,老刑警劉巖中燥,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塘偎,居然都是意外死亡疗涉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門吟秩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咱扣,“玉大人,你說(shuō)我怎么就攤上這事涵防∧治保” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵壮池,是天一觀的道長(zhǎng)偏瓤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)椰憋,這世上最難降的妖魔是什么厅克? 我笑而不...
    開(kāi)封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮橙依,結(jié)果婚禮上证舟,老公的妹妹穿的比我還像新娘。我一直安慰自己窗骑,他們只是感情好女责,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著创译,像睡著了一般抵知。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上软族,一...
    開(kāi)封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天刷喜,我揣著相機(jī)與錄音,去河邊找鬼互订。 笑死吱肌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仰禽。 我是一名探鬼主播氮墨,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纺蛆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了规揪?” 一聲冷哼從身側(cè)響起桥氏,我...
    開(kāi)封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猛铅,沒(méi)想到半個(gè)月后字支,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奸忽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年堕伪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栗菜。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欠雌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疙筹,到底是詐尸還是另有隱情富俄,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布而咆,位于F島的核電站霍比,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏暴备。R本人自食惡果不足惜悠瞬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馍驯。 院中可真熱鬧阁危,春花似錦玛痊、人聲如沸汰瘫。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)混弥。三九已至,卻和暖如春对省,著一層夾襖步出監(jiān)牢的瞬間蝗拿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工蒿涎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哀托,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓劳秋,卻偏偏與公主長(zhǎng)得像仓手,于是被迫代替她去往敵國(guó)和親胖齐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容