深入PHP理解傳址與傳值賦值的區(qū)別

原文地址:http://www.qiusuoweb.com/129.html

最近研讀PHP變量構(gòu)造的資料時(shí)辉饱,發(fā)現(xiàn)了自己一直以來對傳值和傳址賦值理解存在很大的誤區(qū)额获。

之前的理解是這樣子的:

1.傳值是將值復(fù)制一份傳遞給新變量,二者的數(shù)據(jù)不在同一個(gè)地址空間中获雕。

2.傳址是新變量指向了傳址變量的地址牺弄,二者數(shù)據(jù)在同一個(gè)地址空間中焕襟。

不知道大家理解的是不是和我一樣。但是1中的理解是存在問題的肛搬。?傳值賦值變量也指向同一個(gè)地址没佑,直到最后某個(gè)變量的值發(fā)生變化,指向的數(shù)據(jù)地址空間才會分離?滚婉。

接下來是對這個(gè)觀點(diǎn)的驗(yàn)證图筹,驗(yàn)證之前了解一下知識:

要理解這個(gè)先要引入關(guān)鍵詞“zval”。zval結(jié)構(gòu)體是PHP變量在內(nèi)核中的表單方式让腹。在這個(gè)結(jié)構(gòu)體重有4個(gè)成員變量需要知道:

1.refcount:變量引用計(jì)數(shù)器远剩,指這個(gè)變量被多少個(gè)變量引用。

2.type:變量類型骇窍,存儲的數(shù)據(jù)類型“IS_LONG","IS_STRING”等值瓜晤。

3.is_ref:變量是否被引用。

先驗(yàn)證傳值腹纳,代碼如下:

$c=1;xdebug_debug_zval('c');$d=$c;$e=$c;xdebug_debug_zval('c');$c+=1;xdebug_debug_zval('c');xdebug_debug_val('d');

結(jié)果如下:

發(fā)現(xiàn)了沒有當(dāng)$d = $c;的時(shí)候痢掠,refcount = 3說明數(shù)據(jù)內(nèi)存地址被引用了兩次;當(dāng)$c值發(fā)送改變的時(shí)候$c的zval中的refcount = 1嘲恍;$d的zval的refcount此時(shí)也減少1足画,因?yàn)橹蛋l(fā)生了變化$c引用了另一個(gè)數(shù)據(jù)地址空間。

我們稍微改一下代碼佃牛,驗(yàn)證一下傳址淹辞,代碼如下:

$c=1;xdebug_debug_zval('c');$d=&$c;$e=&$c;xdebug_debug_zval('c');$c+=1;xdebug_debug_zval('c');xdebug_debug_zval('d');

只是把傳值改成功了傳址,結(jié)果如下:

看前面兩個(gè)輸出值俘侠,和上面?zhèn)髦档慕Y(jié)果是不是一致呢象缀?完全一致!說明不管是傳值還是傳址賦值時(shí)都指向了同一個(gè)地址空間爷速。只是在數(shù)據(jù)變化的時(shí)候二者才會表現(xiàn)不一致央星。

其實(shí)從宏觀上看,這樣的設(shè)計(jì)是非常有好處的惫东。如果按照之前的理解是成立的話莉给,傳值賦值都會復(fù)制一份值的給另一個(gè)變量,那么$c是一個(gè)非常大的字符串的時(shí)候,復(fù)制一份就造成了內(nèi)存很多浪費(fèi)颓遏。而值一致都變量都指向同一個(gè)數(shù)據(jù)地址空間胁黑,這就能有效的減少內(nèi)存開銷了。

原文地址:http://www.qiusuoweb.com/129.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末州泊,一起剝皮案震驚了整個(gè)濱河市丧蘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遥皂,老刑警劉巖力喷,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異演训,居然都是意外死亡弟孟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進(jìn)店門样悟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拂募,“玉大人,你說我怎么就攤上這事窟她〕轮ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵震糖,是天一觀的道長录肯。 經(jīng)常有香客問我,道長吊说,這世上最難降的妖魔是什么论咏? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮颁井,結(jié)果婚禮上厅贪,老公的妹妹穿的比我還像新娘。我一直安慰自己雅宾,他們只是感情好养涮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秀又,像睡著了一般单寂。 火紅的嫁衣襯著肌膚如雪贬芥。 梳的紋絲不亂的頭發(fā)上吐辙,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天,我揣著相機(jī)與錄音蘸劈,去河邊找鬼昏苏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贤惯。 我是一名探鬼主播洼专,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼孵构!你這毒婦竟也來了屁商?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤颈墅,失蹤者是張志新(化名)和其女友劉穎蜡镶,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恤筛,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡官还,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毒坛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片望伦。...
    茶點(diǎn)故事閱讀 38,694評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖煎殷,靈堂內(nèi)的尸體忽然破棺而出屯伞,到底是詐尸還是另有隱情,我是刑警寧澤豪直,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布愕掏,位于F島的核電站,受9級特大地震影響顶伞,放射性物質(zhì)發(fā)生泄漏饵撑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一唆貌、第九天 我趴在偏房一處隱蔽的房頂上張望滑潘。 院中可真熱鬧,春花似錦锨咙、人聲如沸语卤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粹舵。三九已至,卻和暖如春骂倘,著一層夾襖步出監(jiān)牢的瞬間眼滤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工历涝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诅需,地道東北人漾唉。 一個(gè)月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像堰塌,于是被迫代替她去往敵國和親赵刑。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評論 2 349

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