成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一個(gè)關(guān)于 PHP 的 new 的小問題的探究

MasonEast / 765人閱讀

摘要:?jiǎn)栴}起因前兩天有人在群里說了一個(gè)關(guān)于和的問題,具體表現(xiàn)如下這段代碼是可以正確運(yùn)行的,并且和是兩個(gè)不同的空對(duì)象。即使在之前給添加屬性并賦值,也始終是一個(gè)的空對(duì)象。這本身是一個(gè)很簡(jiǎn)單的問題,不用往復(fù)雜了去想。

問題起因

前兩天有人在群里說了一個(gè)關(guān)于 newstdClass 的問題,具體表現(xiàn)如下:


這段代碼是可以正確運(yùn)行的,并且 $a$b 是兩個(gè)不同的空對(duì)象。即使在 new $a 之前給 $a 添加屬性并賦值,$b 也始終是一個(gè)的空對(duì)象。

所以問題就是:為什么空對(duì)象還可以跟在 new 后面,stdClass 有什么特殊的地方嗎?

實(shí)際表現(xiàn)

其實(shí)主要稍加驗(yàn)證就能知道,其實(shí)這和 stdClass 并沒有什么關(guān)系,完全是 new 的行為決定的,比如在 psysh 上做一下簡(jiǎn)單的測(cè)試:

>>> $a = new Reflection;
=> Reflection {#174}
>>> $b = new $a;
=> Reflection {#177}

這里我是 new 了一個(gè) Reflection 類的實(shí)例,和 stdClass 的表現(xiàn)沒有區(qū)別。當(dāng)然也可以自定義一個(gè)類:

>>> class Test { public $foo = 1; }
=> null
>>> $a = new Test
=> Test {#178
     +foo: 1,
   }
>>> $a->foo = 2;
=> 2
>>> $b = new $a;
=> Test {#180
     +foo: 1,
   }

從這個(gè)例子中我們可以清楚的看到,改變 $a 的屬性對(duì) $b 沒有任何影響(到這里也可以順便思考一下 PHP 的一個(gè)關(guān)鍵字:clone)。

既然已經(jīng)知道了表現(xiàn),也可以得到結(jié)論:通過一個(gè)類的對(duì)象 new 出一個(gè)新對(duì)象等同于 new 原對(duì)象的類。

原因

那么 PHP 是什么樣的實(shí)現(xiàn)造成了這種表現(xiàn)呢?還是從源碼入手來解析這個(gè)問題。

其實(shí)從源碼中,我們可以直奔 zend_vm_def.h 中找到答案,在關(guān)于 ZEND_FETCH_CLASS 這個(gè) opcode 的解釋中,我們可以看到以下內(nèi)容:

ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMPVAR|UNUSED|CV)
{
        ...
        if (OP2_TYPE == IS_CONST) {
            ...
        } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
            Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
        } ...
        ...
}

去掉一些干擾的上下文,上面的內(nèi)容很清晰的呈現(xiàn)出一個(gè)解釋:如果取到的 class_name 是一個(gè)對(duì)象,則通過 Z_OBJCE_P 的宏找到它的類。所以上面的表現(xiàn)解釋起來就很容易了。

這本身是一個(gè)很簡(jiǎn)單的問題,不用往復(fù)雜了去想。如果想知道具體的 new 的實(shí)現(xiàn),可以到 zend_compile.c 文件中去查看 zend_compile_new 的實(shí)現(xiàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22071.html

相關(guān)文章

  • Chrome 小恐龍游戲源碼探究九 -- 游戲碰撞檢測(cè)

    摘要:文章首發(fā)于我的博客前言上一篇文章小恐龍游戲源碼探究八奔跑的小恐龍實(shí)現(xiàn)了小恐龍的繪制以及鍵盤對(duì)小恐龍的控制,這一篇文章中將實(shí)現(xiàn)游戲的碰撞檢測(cè)。 文章首發(fā)于我的 GitHub 博客 前言 上一篇文章:《Chrome 小恐龍游戲源碼探究八 -- 奔跑的小恐龍》實(shí)現(xiàn)了小恐龍的繪制以及鍵盤對(duì)小恐龍的控制,這一篇文章中將實(shí)現(xiàn)游戲的碰撞檢測(cè)。 碰撞檢測(cè)原理 這個(gè)游戲采用的檢測(cè)方法是盒子碰撞,這種檢...

    cpupro 評(píng)論0 收藏0
  • Chrome 小恐龍游戲源碼探究一 -- 繪制靜態(tài)地面

    摘要:首先是繪制靜態(tài)的地面。上一篇下一篇無小恐龍游戲源碼探究二讓地面動(dòng)起來 文章首發(fā)于我的 GitHub 博客 目錄 Chrome 小恐龍游戲源碼探究一 -- 繪制靜態(tài)地面 Chrome 小恐龍游戲源碼探究二 -- 讓地面動(dòng)起來 Chrome 小恐龍游戲源碼探究三 -- 進(jìn)入街機(jī)模式 Chrome 小恐龍游戲源碼探究四 -- 隨機(jī)繪制云朵 Chrome 小恐龍游戲源碼探究五 -- 隨機(jī)繪...

    lixiang 評(píng)論0 收藏0
  • Chrome 小恐龍游戲源碼探究八 -- 奔跑小恐龍

    摘要:例如,將函數(shù)修改為小恐龍眨眼這樣小恐龍會(huì)不停的眨眼睛。小恐龍的開場(chǎng)動(dòng)畫下面來實(shí)現(xiàn)小恐龍對(duì)鍵盤按鍵的響應(yīng)。接下來還需要更新動(dòng)畫幀才能實(shí)現(xiàn)小恐龍的奔跑動(dòng)畫。 文章首發(fā)于我的 GitHub 博客 前言 上一篇文章:《Chrome 小恐龍游戲源碼探究七 -- 晝夜模式交替》實(shí)現(xiàn)了游戲晝夜模式的交替,這一篇文章中,將實(shí)現(xiàn):1、小恐龍的繪制 2、鍵盤對(duì)小恐龍的控制 3、頁面失焦后,重新聚焦會(huì)重置...

    paulquei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<