摘要:?jiǎn)栴}起因前兩天有人在群里說了一個(gè)關(guān)于和的問題,具體表現(xiàn)如下這段代碼是可以正確運(yùn)行的,并且和是兩個(gè)不同的空對(duì)象。即使在之前給添加屬性并賦值,也始終是一個(gè)的空對(duì)象。這本身是一個(gè)很簡(jiǎn)單的問題,不用往復(fù)雜了去想。
問題起因
前兩天有人在群里說了一個(gè)關(guān)于 new 和 stdClass 的問題,具體表現(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
摘要:文章首發(fā)于我的博客前言上一篇文章小恐龍游戲源碼探究八奔跑的小恐龍實(shí)現(xiàn)了小恐龍的繪制以及鍵盤對(duì)小恐龍的控制,這一篇文章中將實(shí)現(xiàn)游戲的碰撞檢測(cè)。 文章首發(fā)于我的 GitHub 博客 前言 上一篇文章:《Chrome 小恐龍游戲源碼探究八 -- 奔跑的小恐龍》實(shí)現(xiàn)了小恐龍的繪制以及鍵盤對(duì)小恐龍的控制,這一篇文章中將實(shí)現(xiàn)游戲的碰撞檢測(cè)。 碰撞檢測(cè)原理 這個(gè)游戲采用的檢測(cè)方法是盒子碰撞,這種檢...
摘要:首先是繪制靜態(tài)的地面。上一篇下一篇無小恐龍游戲源碼探究二讓地面動(dòng)起來 文章首發(fā)于我的 GitHub 博客 目錄 Chrome 小恐龍游戲源碼探究一 -- 繪制靜態(tài)地面 Chrome 小恐龍游戲源碼探究二 -- 讓地面動(dòng)起來 Chrome 小恐龍游戲源碼探究三 -- 進(jìn)入街機(jī)模式 Chrome 小恐龍游戲源碼探究四 -- 隨機(jī)繪制云朵 Chrome 小恐龍游戲源碼探究五 -- 隨機(jī)繪...
摘要:例如,將函數(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ì)重置...
閱讀 2050·2021-11-08 13:22
閱讀 2510·2021-09-04 16:40
閱讀 1156·2021-09-03 10:29
閱讀 1723·2019-08-30 15:44
閱讀 2127·2019-08-30 11:13
閱讀 2796·2019-08-29 17:07
閱讀 1972·2019-08-29 14:22
閱讀 1253·2019-08-26 14:00