摘要:問題起因前兩天有人在群里說了一個關于和的問題,具體表現如下這段代碼是可以正確運行的,并且和是兩個不同的空對象。即使在之前給添加屬性并賦值,也始終是一個的空對象。這本身是一個很簡單的問題,不用往復雜了去想。
問題起因
前兩天有人在群里說了一個關于 new 和 stdClass 的問題,具體表現如下:
這段代碼是可以正確運行的,并且 $a 和 $b 是兩個不同的空對象。即使在 new $a 之前給 $a 添加屬性并賦值,$b 也始終是一個的空對象。
所以問題就是:為什么空對象還可以跟在 new 后面,stdClass 有什么特殊的地方嗎?
實際表現其實主要稍加驗證就能知道,其實這和 stdClass 并沒有什么關系,完全是 new 的行為決定的,比如在 psysh 上做一下簡單的測試:
>>> $a = new Reflection; => Reflection {#174} >>> $b = new $a; => Reflection {#177}這里我是 new 了一個 Reflection 類的實例,和 stdClass 的表現沒有區別。當然也可以自定義一個類:
>>> class Test { public $foo = 1; } => null >>> $a = new Test => Test {#178 +foo: 1, } >>> $a->foo = 2; => 2 >>> $b = new $a; => Test {#180 +foo: 1, }從這個例子中我們可以清楚的看到,改變 $a 的屬性對 $b 沒有任何影響(到這里也可以順便思考一下 PHP 的一個關鍵字:clone)。
既然已經知道了表現,也可以得到結論:通過一個類的對象 new 出一個新對象等同于 new 原對象的類。
原因那么 PHP 是什么樣的實現造成了這種表現呢?還是從源碼入手來解析這個問題。
其實從源碼中,我們可以直奔 zend_vm_def.h 中找到答案,在關于 ZEND_FETCH_CLASS 這個 opcode 的解釋中,我們可以看到以下內容:
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); } ... ... }去掉一些干擾的上下文,上面的內容很清晰的呈現出一個解釋:如果取到的 class_name 是一個對象,則通過 Z_OBJCE_P 的宏找到它的類。所以上面的表現解釋起來就很容易了。
這本身是一個很簡單的問題,不用往復雜了去想。如果想知道具體的 new 的實現,可以到 zend_compile.c 文件中去查看 zend_compile_new 的實現。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22071.html
摘要:文章首發于我的博客前言上一篇文章小恐龍游戲源碼探究八奔跑的小恐龍實現了小恐龍的繪制以及鍵盤對小恐龍的控制,這一篇文章中將實現游戲的碰撞檢測。 文章首發于我的 GitHub 博客 前言 上一篇文章:《Chrome 小恐龍游戲源碼探究八 -- 奔跑的小恐龍》實現了小恐龍的繪制以及鍵盤對小恐龍的控制,這一篇文章中將實現游戲的碰撞檢測。 碰撞檢測原理 這個游戲采用的檢測方法是盒子碰撞,這種檢...
摘要:首先是繪制靜態的地面。上一篇下一篇無小恐龍游戲源碼探究二讓地面動起來 文章首發于我的 GitHub 博客 目錄 Chrome 小恐龍游戲源碼探究一 -- 繪制靜態地面 Chrome 小恐龍游戲源碼探究二 -- 讓地面動起來 Chrome 小恐龍游戲源碼探究三 -- 進入街機模式 Chrome 小恐龍游戲源碼探究四 -- 隨機繪制云朵 Chrome 小恐龍游戲源碼探究五 -- 隨機繪...
摘要:例如,將函數修改為小恐龍眨眼這樣小恐龍會不停的眨眼睛。小恐龍的開場動畫下面來實現小恐龍對鍵盤按鍵的響應。接下來還需要更新動畫幀才能實現小恐龍的奔跑動畫。 文章首發于我的 GitHub 博客 前言 上一篇文章:《Chrome 小恐龍游戲源碼探究七 -- 晝夜模式交替》實現了游戲晝夜模式的交替,這一篇文章中,將實現:1、小恐龍的繪制 2、鍵盤對小恐龍的控制 3、頁面失焦后,重新聚焦會重置...
閱讀 2037·2021-11-08 13:22
閱讀 2500·2021-09-04 16:40
閱讀 1144·2021-09-03 10:29
閱讀 1710·2019-08-30 15:44
閱讀 2120·2019-08-30 11:13
閱讀 2785·2019-08-29 17:07
閱讀 1963·2019-08-29 14:22
閱讀 1244·2019-08-26 14:00