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

資訊專欄INFORMATION COLUMN

PHP中引用傳遞+unset+global理解,希望大神指正

ConardLi / 3151人閱讀

摘要:即產(chǎn)生了相當(dāng)于這樣的效果,所以改變的值也同時(shí)改變了的值。不要用返回引用來(lái)增加性能,引擎足夠聰明來(lái)自己進(jìn)行優(yōu)化。只能從函數(shù)返回引用變量沒(méi)別的方法。

關(guān)鍵是對(duì)global的誤解,之前以為在函數(shù)中g(shù)lobal變量,就是把函數(shù)外部的變量拿進(jìn)函數(shù)內(nèi)部使用,但似乎我錯(cuò)了
引用傳遞+unset+global理解

php的引用(就是在變量、函數(shù)、對(duì)象等前面加上&符號(hào))
在PHP中引用的意思是:不同的名字訪問(wèn)同一個(gè)內(nèi)存地址

1、變量的引用:PHP的引用允許你用兩個(gè)變量來(lái)指向同一個(gè)內(nèi)存空間
代碼:

結(jié)果:

2、函數(shù)的傳址調(diào)用

這里$num傳遞給函數(shù)的其實(shí)是$num所處的內(nèi)存地址,通過(guò)在函數(shù)里改變$a的值,就可以改變$num的值了

3、函數(shù)的引用返回 —— 沒(méi)太明白什么時(shí)候用
和參數(shù)傳遞不同,函數(shù)的引用返回必須在兩個(gè)地方都用 & 符號(hào)(函數(shù)聲明時(shí)、函數(shù)調(diào)用時(shí)) —— 指出返回的是一個(gè)引用,而不是通常的一個(gè)拷貝

結(jié)果:

結(jié)果:

結(jié)果:

結(jié)果:

下面解釋下:
盡管函數(shù)聲明方式是 function &test() 這樣,但通過(guò)$a = test() 這種方式的函數(shù)調(diào)用得到的其實(shí)不是函數(shù)的引用返回,這跟普通的函數(shù)調(diào)用沒(méi)有區(qū)別
PHP規(guī)定通過(guò) $a = &test() 并且在聲明函數(shù)時(shí)也使用了&,得到的才是函數(shù)的引用返回
用上面的例子來(lái)解釋就是,$a = test() 這種方式調(diào)用函數(shù),只是將函數(shù)的返回值賦給 $a 而已,而$a做任何改變都不會(huì)影響到函數(shù)中的$b

而通過(guò) $a = &test() 方式調(diào)用函數(shù)呢(前提是聲明函數(shù)時(shí)也用了&),它的作用是將 return $b 中的 $b 變量的內(nèi)存地址與 $a 變量的內(nèi)存地址指向了同一個(gè)地方。即產(chǎn)生了相當(dāng)于這樣的效果 ($a=&$b), 所以改變 $a 的值也同時(shí)改變了 $b 的值。所以在執(zhí)行了
$a = &test();
$a = 5;
以后,$b的值也變?yōu)榱?

再來(lái)個(gè)例子加深理解:
PHP里的函數(shù)的引用在定義及調(diào)用都要在函數(shù)名前加上 &

結(jié)果:

這里是為了讓大家理解函數(shù)的引用返回才使用靜態(tài)變量的,其實(shí)函數(shù)的引用返回多用在對(duì)象中
很多時(shí)候我們會(huì)看到這樣的代碼(出自 CI 框架源碼):
$class =& load_class("a","b");

手冊(cè)里是這么寫(xiě)的:引用返回用在當(dāng)想用函數(shù)找到引用應(yīng)該被綁定在哪一個(gè)變量上面時(shí)。不要用返回引用來(lái)增加性能,引擎足夠聰明來(lái)自己進(jìn)行優(yōu)化。僅在有合理的技術(shù)原因時(shí)才返回引用!要返回引用,使用此語(yǔ)法:

和參數(shù)傳遞不同,這里必須在兩個(gè)地方都用 & 符號(hào)——指出返回的是一個(gè)引用,而不是通常的一個(gè)拷貝,同樣也指出 $myValue 是作為引用的綁定,而不是通常的賦值
如果試圖這樣從函數(shù)返回引用:return ($this->value);,這將不會(huì)起作用,因?yàn)樵谠噲D返回一個(gè)表達(dá)式的結(jié)果而不是一個(gè)引用的變量。只能從函數(shù)返回引用變量——沒(méi)別的方法。如果代碼試圖返回一個(gè)動(dòng)態(tài)表達(dá)式或 new 運(yùn)算符的結(jié)果,自 PHP 4.4.0 和 PHP 5.1.0 起會(huì)發(fā)出一條 E_NOTICE 錯(cuò)誤
似懂非懂?那么我們來(lái)改寫(xiě)一下程序吧,讓它變成一個(gè)常規(guī)的函數(shù):

結(jié)果:

現(xiàn)在能理解“引用返回用在當(dāng)想用函數(shù)找到引用應(yīng)該被綁定在哪一個(gè)變量上面時(shí)”這句話了吧,函數(shù) &getValue() 把引用綁定在成員變量 $value 上了。正常來(lái)說(shuō),$obj = new foo; 產(chǎn)生的 $obj 是一個(gè)copy,它的成員變量 $value 與函數(shù) getValue() 不存在“別名”(引用)關(guān)系(額,不太懂)

4、對(duì)象的引用

結(jié)果:

以上代碼是在PHP5中的運(yùn)行效果,在PHP5中對(duì)象的復(fù)制是通過(guò)引用來(lái)實(shí)現(xiàn)的。上列中$b=new a; $c=$b; 其實(shí)等效于$b=new a; $c=&$b; PHP5中默認(rèn)就是通過(guò)引用來(lái)調(diào)用對(duì)象, 但有時(shí)你可能想建立一個(gè)對(duì)象的副本,并希望原來(lái)的對(duì)象的改變不影響到副本,為了這樣的目的,PHP定義了一個(gè)特殊的方法,稱為_(kāi)_clone
php5中對(duì)于大數(shù)組的傳遞,建議用 "&" 方式,畢竟節(jié)省內(nèi)存空間使用

5、取消引用
重要的是刪除引用的變量,當(dāng)你 unset 一個(gè)引用,只是斷開(kāi)了變量名和內(nèi)存地址之間的綁定。只是unset的變量訪問(wèn)不了,這并不意味著內(nèi)存地址被銷毀了

不會(huì) unset $b,只是 $a

地址(引用)傳遞,只是多個(gè)變量指向了同一地址(內(nèi)存空間)
unset一個(gè),并不能unset掉地址空間

根據(jù)這個(gè)原理,我們來(lái)屢屢$a和$GLOBALS["a"]之間的關(guān)系
代碼1:

代碼2:

結(jié)果:

代碼3:

結(jié)果:

根據(jù)這三段代碼的結(jié)果,$a和$GLOBALS["a"]在內(nèi)存中的關(guān)系肯定不是這樣的

如果是這樣的話,unset掉一個(gè),另一個(gè)應(yīng)該還是存在的
所以個(gè)人猜測(cè)關(guān)系應(yīng)該是這樣的:

其中一個(gè)是另一個(gè)的別名
關(guān)于這個(gè)問(wèn)題,也問(wèn)了一些人,各有個(gè)的說(shuō)法,況且都牽扯到了PHP底層機(jī)制,暫且放一放,按照上面說(shuō)的來(lái)理解吧

6、global

這里的$num =& $GLOBALS["num"]; $num是函數(shù)里的$num,函數(shù)里的$num指向了$GLOBALS["num"]的內(nèi)存地址

global 引用
當(dāng)在函數(shù)中用 global $var 聲明一個(gè)變量時(shí)實(shí)際上建立了一個(gè)到全局變量的引用。也就是說(shuō)和這樣做是相同的:
$var =& $GLOBALS["var"];
這意味著,unset $var 不會(huì) unset 全局變量

$this 在一個(gè)對(duì)象的方法中,永遠(yuǎn)是調(diào)用它的對(duì)象的引用

再來(lái)一個(gè)例子:

結(jié)果:

為什么會(huì)是0 5呢?
global在函數(shù)中產(chǎn)生一個(gè)指向函數(shù)外部變量的別名變量,而不是真的把函數(shù)外的變量拿到函數(shù)中使用
一旦改變了別名變量(函數(shù)內(nèi)部的變量)的指向地址
$var2 =& $var1;
其實(shí)就是函數(shù)中$var2的引用指向了$var1的內(nèi)存地址
只是函數(shù)中$var2的指向發(fā)生了變化,函數(shù)內(nèi)部變量的變化只在函數(shù)的局部產(chǎn)生效應(yīng),在函數(shù)外部$var2的指向物理內(nèi)存地址并沒(méi)有變化,還是它自己,所以根本就沒(méi)有改變函數(shù)外$var2的值
$GLOBALS[]確確實(shí)實(shí)調(diào)用的是函數(shù)外部的變量,函數(shù)內(nèi)外始終保持一致!

結(jié)果:

7、寫(xiě)時(shí)拷貝
php中對(duì)于地址的指向(類似指針)功能不是由用戶自己來(lái)實(shí)現(xiàn)的,是由Zend核心實(shí)現(xiàn)的,php中引用采用的是寫(xiě)時(shí)拷貝的原理,就是除非發(fā)生寫(xiě)操作,指向同一個(gè)地址的變量或者對(duì)象是不會(huì)被拷貝的
通俗的講:
① 如果有下面的代碼
$a="ABC"; $b=$a;
其實(shí)此時(shí),$a與$b都是指向同一內(nèi)存地址,而并不是$a與$b占用不同的內(nèi)存
② 如果在上面的代碼基礎(chǔ)上再加上如下代碼
$a="EFG";
由于$a與$b所指向的內(nèi)存的數(shù)據(jù)要重新寫(xiě)一次了,此時(shí)Zend核心會(huì)自動(dòng)判斷,自動(dòng)為$b產(chǎn)生一個(gè)$a的數(shù)據(jù)拷貝,重新申請(qǐng)一塊內(nèi)存進(jìn)行存儲(chǔ)

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

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

相關(guān)文章

  • 搞定PHP面試 - 深入了解引用

    摘要:引用可以被看作是文件系統(tǒng)中的硬鏈接。如果具有引用的數(shù)組被復(fù)制,其值不會(huì)解除引用。如果試圖這樣從函數(shù)返回引用,將會(huì)報(bào)錯(cuò),因?yàn)楹瘮?shù)在試圖返回一個(gè)表達(dá)式的結(jié)果而不是一個(gè)引用的變量。這并不意味著變量?jī)?nèi)容被銷毀了。 1. 什么是引用 在 PHP 中引用是指用不同的名字訪問(wèn)同一個(gè)變量?jī)?nèi)容。PHP 中的變量名和變量?jī)?nèi)容是不一樣的, 因此同樣的內(nèi)容可以有不同的名字。最接近的比喻是 Unix 的文件名和...

    fox_soyoung 評(píng)論0 收藏0
  • 關(guān)于PHP5后“默認(rèn)情況下對(duì)象是通過(guò)引用傳遞的”思考

    摘要:中的對(duì)象傳遞然后說(shuō)一下之后的默認(rèn)情況下的對(duì)象是通過(guò)引用傳遞的這件事情。如此時(shí),其實(shí)表示的并不是是的引用,和可以說(shuō)是沒(méi)什么關(guān)系的,有關(guān)系的是實(shí)例化類得到的對(duì)象。 首先引發(fā)這篇博文的是來(lái)源于這篇帖子:https://segmentfault.com/q/10... 經(jīng)過(guò)了思考之后,我決定把回答思考變成博客做一下記錄,如有不對(duì)之處,歡迎指正。 指針與引用 首先,引用和指針是不一樣的,指針在...

    hosition 評(píng)論0 收藏0
  • php獲取變量的狀態(tài)

    摘要:銷毀給定的變量函數(shù)的行為依賴于給定的變量的類型而有所不同。以上例程會(huì)輸出如果在函數(shù)中一個(gè)靜態(tài)變量,那么在函數(shù)內(nèi)部此靜態(tài)變量之前將被銷毀。但是,當(dāng)再次調(diào)用此函數(shù)時(shí),此靜態(tài)變量將被復(fù)原為上次被銷毀之前的值。 isset() isset()-檢測(cè)變量是否設(shè)置 語(yǔ)法: bool isset (mixed $var [,mixed $var [,$....]]) 說(shuō)明: 如果var存在則返回tr...

    antz 評(píng)論0 收藏0
  • PHPglobal與$GLOBALS的區(qū)別

    摘要:是一個(gè)關(guān)聯(lián)數(shù)組,每一個(gè)變量為一個(gè)元素,鍵名對(duì)應(yīng)變量名,值對(duì)應(yīng)變量的內(nèi)容。之所以在全局范圍內(nèi)存在,是因?yàn)槭且粋€(gè)超全局變量。 概念 單一個(gè)global是一個(gè)關(guān)鍵字,通常附加在變量前,用于將變量聲明至全局作用域;$GLOBALS是預(yù)定義的超全局變量,把變量扔到里邊的話一樣可以帶到全局去。 $GLOBALS 是一個(gè)關(guān)聯(lián)數(shù)組,每一個(gè)變量為一個(gè)元素,鍵名對(duì)應(yīng)變量名,值對(duì)應(yīng)變量的內(nèi)容。$GLOBAL...

    RaoMeng 評(píng)論0 收藏0
  • PHP 引用是個(gè)坑,請(qǐng)慎用

    摘要:發(fā)布時(shí)最大的變動(dòng)是對(duì)象處理方式。這很容易被誤解為引用,但是存儲(chǔ)器的引用與引用是完全不同的概念。使用引用是一件不好的事情,除了引用本身不好,并且還會(huì)使性能下降這個(gè)事實(shí)外,使用引用這種方式會(huì)使得代碼難以維護(hù)。 showImg(https://segmentfault.com/img/remote/1460000014082570); 去年我參加了很多次會(huì)議,其中八次會(huì)議里我進(jìn)行了相關(guān)發(fā)言,...

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

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

0條評(píng)論

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