日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > php教程 > php 引用傳值學(xué)習(xí)筆記

php 引用傳值學(xué)習(xí)筆記

來源:程序員人生   發(fā)布時間:2014-06-14 20:02:11 閱讀次數(shù):4194次

在php中使用引用賦值只需要在原始對象前加個&就可以了,$a = &$b;其實php中的引用就是兩個不同名稱的變量指向同一個值。

引用是什么

在 PHP 中引用意味著用不同的名字訪問同一個變量內(nèi)容。這并不像 C 的指針,替代的是,引用是符號表別名。注意在 PHP 中,變量名和變量內(nèi)容是不一樣的,因此同樣的內(nèi)容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——變量名是目錄條目,而變量內(nèi)容則是文件本身。引用可以被看作是 Unix 文件系統(tǒng)中的 hardlink。

一:變量的引用,代碼如下:

  1. <?php 
  2. $a =100; 
  3. $b = &$a
  4. echo $b;    //這里輸出100 
  5. echo $a;    //這里輸出100  ,說明$a,和$b的值都是一百。 
  6. $b= 200; 
  7. echo $a;    //這里輸出200 
  8. echo $b;    //這里輸出200,這就可以看出他們用的是同一個地址。改變一個,另一個也會跟著改變。 
  9. ?> 

二:函數(shù)中引用傳值,代碼如下:

  1. <?php 
  2. function main($a,$b){ 
  3.     $b$a+100; 
  4.     return $b
  5. main(55,&$b); //這里的$b其實就是把它的內(nèi)存地址傳遞給函數(shù)main中的$b參數(shù),通過參數(shù)$b的改變而改變外面的$b的值。 
  6. echo $b;  //這里會輸出155, 
  7. ?> 

三:對象的引用傳值,對象的引用,代碼如下:

  1. <? 
  2. class club{ 
  3. var $name="real madrid"
  4. $b=new club; 
  5. $c=$b
  6. echo $b->name;//這里輸出real madrid 
  7. echo $c->name;//這里輸出real madrid 
  8. $b->name="ronaldo"
  9. echo $c->name;//這里輸出ronaldo 
  10. ?> 

取消引用:當你 unset 一個引用,只是斷開了變量名和變量內(nèi)容之間的綁定,這并不意味著變量內(nèi)容被銷毀了,例如如下代碼:

  1. <?php 
  2. $a = 'ronaldo' 
  3. $b =&$a
  4. unset ($a); 
  5. ?> 

不會 unset $b,只是 $a,例,引用傳遞,test1.php,代碼如下:

  1. <?php  
  2. /**  
  3. *   引用傳遞  
  4.     以下內(nèi)容可以通過引用傳遞:  
  5.     變量,例如 foo($a)  
  6.     New 語句,例如 foo(new foobar())  
  7.     從函數(shù)中返回的引用,例如:  
  8.    
  9. */ 
  10.     function foo(&$var)  
  11.     {  
  12.         $var++;  
  13.     }  
  14.    
  15.     $a=5;  
  16.     //合法  
  17.     foo($a);  
  18.     foo(new stdClass());  
  19.     //非法使用  
  20.     function bar() // Note the missing &  
  21.     {  
  22.        $a = 5;  
  23.        return $a;  
  24.     }  
  25.     foo(bar()); // 自 PHP 5.0.5 起導(dǎo)致致命錯誤  
  26.     foo($a = 5) // 表達式,不是變量  
  27.     foo(5) // 導(dǎo)致致命錯誤  
  28.    
  29. ?> 

test2.php,代碼如下:

  1. <?php  
  2. function test(&$a)  
  3. {  
  4. $a=$a+100;  
  5. }  
  6. $b=1;  
  7. echo $b;//輸出1  
  8. test($b);   //這里$b傳遞給函數(shù)的其實是$b的變量內(nèi)容所處的內(nèi)存地址,通過在函數(shù)里改變$a的值 就可以改變$b的值了  
  9.    
  10. echo "<br>";  
  11.    
  12. echo $b;//輸出101  
  13.    
  14. /*****************************  
  15.  
  16. * 這里需要注意 call_user_func_array 后的參數(shù)是需要 &  
  17.  
  18. * ****************************/ 
  19.    
  20.     //上面的“ test($b); ” 中的$b前面不要加 & 符號,但是在函數(shù)“call_user_func_array”中,若要引用傳參,就得需要 & 符號,如下代碼所示:  
  21.    
  22.     function a(&$b){  
  23.         $b++;  
  24.     }  
  25.     $c=0;  
  26.     call_user_func_array('a',array(&$c));  
  27.     echo $c;  
  28. //輸出 1  
  29. ?> 

引用返回

引用返回用在當想用函數(shù)找到引用應(yīng)該被綁定在哪一個變量上面時,不要用返回引用來增加性能,引擎足夠聰明來自己進行優(yōu)化,僅在有合理的技術(shù)原因時才返回引用!要返回引用,使用此語法,代碼如下:

  1. <?php  
  2. function &test()  
  3. {  
  4. static $b=0;//申明一個靜態(tài)變量  
  5. $b=$b+1;  
  6. echo $b;  
  7. return $b;  
  8. }  
  9.    
  10.     $a=test();//這條語句會輸出 $b的值 為1  
  11.     $a=5;  
  12.     $a=test();//這條語句會輸出 $b的值 為2  
  13.    
  14.     $a=&test();//這條語句會輸出 $b的值 為3  這里將return $b中的 $b變量的內(nèi)存地址與$a變量的內(nèi)存地址 指向了同一個地方  
  15.     $a=5;  //已經(jīng)改變了 return $b中的 $b變量的值  
  16.    
  17.     $a=test();//這條語句會輸出 $b的值 為6  
  18. /**  
  19. ?> 

下面解釋下:

通過這種方式$a=test();得到的其實不是函數(shù)的引用返回,這跟普通的函數(shù)調(diào)用沒有區(qū)別,至于原因:這是PHP的規(guī)定 

PHP規(guī)定通過$a=&test(); 方式得到的才是函數(shù)的引用返回 

至于什么是引用返回呢(PHP手冊上說:引用返回用在當想用函數(shù)找到引用應(yīng)該被綁定在哪一個變量上面時)這句狗屁話,害我半天沒看懂 

用上面的例子來解釋就是:$a=test()方式調(diào)用函數(shù),只是將函數(shù)的值賦給$a而已,而$a做任何改變 都不會影響到函數(shù)中的$b,而通過$a=&test()方式調(diào)用函數(shù)呢, 他的作用是將return $b中的$b變量的內(nèi)存地址與$a變量的內(nèi)存地址,指向了同一個地方,即產(chǎn)生了相當于這樣的效果($a=&$b;) 所以改變$a的值,也同時改變了$b的值,所以在執(zhí)行了 

$a=&test(); $a=5; 以后,$b的值變?yōu)榱? 

這里是為了讓大家理解函數(shù)的引用返回才使用靜態(tài)變量的,其實函數(shù)的引用返回多用在對象中.

在舉一個有意思的例子是在oschina上看到的,代碼如下:

  1. <?php  
  2. $a = array('abe','ben','cam');  
  3. foreach ($a as $k=>&$n)  
  4.     $n = strtoupper($n);  
  5. foreach ($a as $k=>$n// notice NO reference here!  
  6.     echo "$nn";  
  7. print_r($a);  
  8. ?> 
  9. will result in: 
  10.  
  11. ABE 
  12. BEN 
  13. BEN 
  14. Array 
  15.     [0] => ABE 
  16.     [1] => BEN 
  17.     [2] => BEN 
  18. //解釋: 在第二個foreach中循環(huán)如下: 
  19. Array 
  20. [0] => ABE 
  21. [1] => BEN 
  22. [2] => ABE 
  23. Array 
  24. [0] => ABE 
  25. [1] => BEN 
  26. [2] => BEN 
  27. Array 
  28. [0] => ABE 
  29. [1] => BEN 
  30. [2] => BEN 

因為沒有unset($n),所以它始終指向數(shù)組的最后一個元素,第二個foreach里第一次循環(huán)把$n,也就是$a[2]改成了ABE,第二次循環(huán)改成了BEN,第三次就也是BEN了。

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 一级毛片一级毛片 | 一区在线看 | 亚洲日韩欧美一区二区在线 | 99久久免费国产 | 中文字幕日韩视频 | 一级片自拍| 在线激情网站 | 在线观看国产一区二区 | 尤物国产| 九九综合九九综合 | 欧美一区日韩一区 | 国产精品一区二区三区四区 | 日韩视频免费在线观看 | 国产成人精品久久久 | 国产一区二区三区在线免费看 | 麻豆精品国产传媒 | 91福利网站 | 久久久久久久一区 | 色网站免费 | 精品一区二区三区免费 | 日本综合视频 | 亚洲最大中文字幕 | 性欧美xxxxporn| 国内精品国产三级国产在线专 | 国产精彩视频 | 精品三区视频 | 日韩成人av在线播放 | 国产视频亚洲精品 | 中文字幕一区二区三区在线播放 | 精品麻豆| 一区二区视频在线 | 成人久久精品 | 国产一区二区三区四区五区入口 | 国产精品视频不卡 | 国产三级午夜理伦三级 | 中久免费中文 | 一区二区三区高清 | 99久久精品国产毛片 | 精品一区二区三区成人精品 | 国产精品黄 | a级毛片播放 |