摘要:若一個(gè)變量是一個(gè)對(duì)象,那么該變量保存的就是一個(gè)引用類型的值,即變量中實(shí)際保存的是堆內(nèi)存中對(duì)象的地址,而不是對(duì)象的實(shí)體若變量為其他類型,則保存的是基本類型值,而不是引用地址。新創(chuàng)建的對(duì)象在函數(shù)執(zhí)行之后被銷毀。
在 PHP 和 JavaScript 中(或許還有其他語(yǔ)言),變量?jī)?nèi)所保存的值分為 基本類型值 和 引用類型值。
$obj = new stdClass;
若一個(gè)變量是一個(gè)對(duì)象,那么該變量保存的就是一個(gè)引用類型的值,即變量中實(shí)際保存的是堆內(nèi)存中對(duì)象的地址,而不是對(duì)象的實(shí)體;若變量為其他類型,則保存的是基本類型值,而不是引用地址。這一點(diǎn)需要特別注意,因?yàn)槲覀兛赡軙?huì)遇到如下幾種情況,不清楚原理可能導(dǎo)致出錯(cuò)。
賦值$obj_1 = new stdClass; $obj_2 = $obj_1; $obj_1->name = "Xavier"; var_dump($obj_1->name, $obj_2->name); var_dump($obj_1, $obj_2);
輸出:
string(6) "Xavier" string(6) "Xavier" object(stdClass)#1 (1) { ["name"]=> string(6) "Xavier" } object(stdClass)#1 (1) { ["name"]=> string(6) "Xavier" }
我們發(fā)現(xiàn) obj_2 的 name 也發(fā)生的改變,原因是 obj_1 和 obj_2 指向同一個(gè)對(duì)象 #1 ,因?yàn)樵诘诙兄校覀儗?obj_1 所指向的對(duì)象的地址賦給了 obj_2 。
傳遞參數(shù)我們來(lái)看這段代碼:
function setName($obj) { $obj->name = "Xavier"; } $person = new stdClass; setName($person); var_dump($person->name); // 輸出 string(6) "Xavier"
若變量為一個(gè)對(duì)象,那么當(dāng)它作為參數(shù)傳遞給一個(gè)函數(shù)時(shí),同樣,傳遞的是一個(gè)對(duì)象地址,而不是拷貝了一個(gè)新的對(duì)象實(shí)體給參數(shù) $obj 。這樣,函數(shù)內(nèi)部并沒(méi)有 return 新的東西出來(lái)但改變了外部的狀態(tài) 的這種情況就變得好理解了。
接下來(lái),請(qǐng)看這段代碼:
function setName($obj) { $obj->name = "Xavier"; $obj = new stdClass; $obj->name = "Zhao"; } $person = new stdClass; setName($person); var_dump($person->name); // 輸出了 string(6) "Xavier" 而不是 string(6) "Zhao"
最后的輸出結(jié)果可能會(huì)讓很多人會(huì)疑惑,他們的思維可能是這樣的:
我將 person 對(duì)象的引用地址傳遞給 obj參數(shù)
在函數(shù)內(nèi)部第一行,根據(jù) obj 的引用地址,我將函數(shù)外部對(duì)象的 name 屬性設(shè)置成了 "Xavier"
在第二行,我將一個(gè)新的對(duì)象賦給了 obj ,既然 obj 為函數(shù)外部對(duì)象的引用,那么外部對(duì)象也一定變?yōu)榱诉@個(gè)新的對(duì)象
然后我再給這個(gè)新的對(duì)象設(shè)置新的 name 屬性 "zhao" ,嗯,這樣外部對(duì)象的 name 一定也變成了 "zhao"
如果你想的和上方相同,那可就大錯(cuò)特錯(cuò)了,原因在于對(duì)傳遞參數(shù)的過(guò)程的錯(cuò)誤理解。
首先,我們應(yīng)該明白,將一個(gè)變量作為參數(shù)傳遞給函數(shù) 可以理解為 將那個(gè)變量保存的值 復(fù)制一份給 函數(shù)的參數(shù)(參數(shù)即函數(shù)范圍的局部變量) 。當(dāng)函數(shù)執(zhí)行時(shí),外部變量 和 函數(shù)參數(shù)(局部變量) 是同時(shí)存在于內(nèi)存中的,并且兩者是相互獨(dú)立的,雖然兩者所保存的值是相同的;函數(shù)參數(shù)(局部變量) 會(huì)在函數(shù)執(zhí)行完畢后被銷毀。
明白了上述原理,那么我們重新來(lái)看那段代碼:
函數(shù)的 obj 變量在函數(shù)內(nèi)第一行保存的是函數(shù)外部 person 變量所保存的值,也就是外部對(duì)象的地址
但到了第二行,obj 變量所保存的值變成了新創(chuàng)建的對(duì)象的地址,obj 的指向發(fā)生了改變,而原來(lái)的外部對(duì)象依舊存在并且只被 person 一個(gè)變量引用,所以在第三行的行為并沒(méi)有影響到 person 所指向的那個(gè)對(duì)象。新創(chuàng)建的對(duì)象在函數(shù)執(zhí)行之后被銷毀。
所以有代碼中注釋的輸出結(jié)果。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/28668.html
摘要:對(duì)于來(lái)說(shuō),變量有全局變量和局部變量之分那么,他們都是存儲(chǔ)到一個(gè)哈希表內(nèi)了么其實(shí)不是的,變量存儲(chǔ)也有作用域的概念。 上次跟大家講了垃圾回收機(jī)制后,有些小伙伴對(duì)底層原理比較感興趣,私信問(wèn)我了一些關(guān)于變量的相關(guān)知識(shí),既然大家對(duì)變量比較感興趣,那么這次我們來(lái)系統(tǒng)的講一下變量的底層原理 變量結(jié)構(gòu) 首先,我們還是先擺上我們的zval結(jié)構(gòu)體,即php所有變量都會(huì)以zval結(jié)構(gòu)體的形式實(shí)現(xiàn) struc...
摘要:小駝峰法大駝峰法匈牙利命名法變量名屬性類型對(duì)象描述。是一種弱類型語(yǔ)言,變量在使用之前并不需要聲明類型,且同一變量可以保存多種不同類型的數(shù)據(jù)。另外,在函數(shù)內(nèi)部創(chuàng)建的靜態(tài)變量是無(wú)法在函數(shù)外部使用的。 變量標(biāo)識(shí)符 標(biāo)識(shí)符即是變量的名稱,PHP 中關(guān)于變量的標(biāo)識(shí)符有以下規(guī)則: 由任意字母、數(shù)字、下劃線組成,但不能以數(shù)字開(kāi)頭 嚴(yán)格區(qū)分大小寫 為了科學(xué)規(guī)范標(biāo)識(shí)符,主要有以下幾種流行的命名方式:...
摘要:若一個(gè)變量是一個(gè)對(duì)象,那么該變量保存的就是一個(gè)引用類型的值,即變量中實(shí)際保存的是堆內(nèi)存中對(duì)象的地址,而不是對(duì)象的實(shí)體若變量為其他類型,則保存的是基本類型值,而不是引用地址。新創(chuàng)建的對(duì)象在函數(shù)執(zhí)行之后被銷毀。 在 PHP 和 JavaScript 中(或許還有其他語(yǔ)言),變量?jī)?nèi)所保存的值分為 基本類型值 和 引用類型值。 $obj = new stdClass; 若一個(gè)變量是一個(gè)對(duì)象,那...
摘要:面試專欄正式起更,每周一三五更新,提供最好最優(yōu)質(zhì)的面試內(nèi)容。繼上一篇面試常考內(nèi)容之面向?qū)ο蟀l(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄C嫦驅(qū)ο蟮闹饕卣鳛榉庋b繼承多態(tài)。為了提高內(nèi)聚性減少引起變化,單一原則是低耦合高內(nèi)聚的面向原則上的引申。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。繼上一篇PHP面試常考內(nèi)容之面向?qū)ο螅?)發(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?...
摘要:本文適合閱讀用戶有其他語(yǔ)言基礎(chǔ)的童鞋看完語(yǔ)法教程來(lái)回顧一下的童鞋傳送門,想全面看一下語(yǔ)法推薦這里毫無(wú)基礎(chǔ)然而天資聰慧頗有慧根不要左顧右看說(shuō)的就是你,老夫這里有一本從入門到放棄,觀你根骨清奇兩銀子賣給你如何看完本文后你會(huì)收獲到什么的變量的定義 本文適合閱讀用戶 有其他語(yǔ)言基礎(chǔ)的童鞋 看完w3cschool語(yǔ)法教程來(lái)回顧一下的童鞋(傳送門,想全面看一下php語(yǔ)法推薦這里) 毫無(wú)基礎(chǔ)然而天...
閱讀 713·2023-04-25 17:54
閱讀 2972·2021-11-18 10:02
閱讀 1132·2021-09-28 09:35
閱讀 649·2021-09-22 15:18
閱讀 2847·2021-09-03 10:49
閱讀 3051·2021-08-10 09:42
閱讀 2573·2019-08-29 16:24
閱讀 1255·2019-08-29 15:08