多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > php 引用傳值學習筆記

php 引用傳值學習筆記

來源:程序員人生   發布時間:2014-06-14 20:02:11 閱讀次數:4186次

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

引用是什么

在 PHP 中引用意味著用不同的名字訪問同一個變量內容。這并不像 C 的指針,替代的是,引用是符號表別名。注意在 PHP 中,變量名和變量內容是不一樣的,因此同樣的內容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——變量名是目錄條目,而變量內容則是文件本身。引用可以被看作是 Unix 文件系統中的 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. ?> 

二:函數中引用傳值,代碼如下:

  1. <?php 
  2. function main($a,$b){ 
  3.     $b$a+100; 
  4.     return $b
  5. main(55,&$b); //這里的$b其實就是把它的內存地址傳遞給函數main中的$b參數,通過參數$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 一個引用,只是斷開了變量名和變量內容之間的綁定,這并不意味著變量內容被銷毀了,例如如下代碼:

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

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

  1. <?php  
  2. /**  
  3. *   引用傳遞  
  4.     以下內容可以通過引用傳遞:  
  5.     變量,例如 foo($a)  
  6.     New 語句,例如 foo(new foobar())  
  7.     從函數中返回的引用,例如:  
  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 起導致致命錯誤  
  26.     foo($a = 5) // 表達式,不是變量  
  27.     foo(5) // 導致致命錯誤  
  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傳遞給函數的其實是$b的變量內容所處的內存地址,通過在函數里改變$a的值 就可以改變$b的值了  
  9.    
  10. echo "<br>";  
  11.    
  12. echo $b;//輸出101  
  13.    
  14. /*****************************  
  15.  
  16. * 這里需要注意 call_user_func_array 后的參數是需要 &  
  17.  
  18. * ****************************/ 
  19.    
  20.     //上面的“ test($b); ” 中的$b前面不要加 & 符號,但是在函數“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. ?> 

引用返回

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

  1. <?php  
  2. function &test()  
  3. {  
  4. static $b=0;//申明一個靜態變量  
  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變量的內存地址與$a變量的內存地址 指向了同一個地方  
  15.     $a=5;  //已經改變了 return $b中的 $b變量的值  
  16.    
  17.     $a=test();//這條語句會輸出 $b的值 為6  
  18. /**  
  19. ?> 

下面解釋下:

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

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

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

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

$a=&test(); $a=5; 以后,$b的值變為了5 

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

在舉一個有意思的例子是在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中循環如下: 
  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),所以它始終指向數組的最后一個元素,第二個foreach里第一次循環把$n,也就是$a[2]改成了ABE,第二次循環改成了BEN,第三次就也是BEN了。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 女人一级特纯黄大片色 | 欧美亚洲h在线一区二区 | 最近最新中文字幕1页 | 在线亚洲一区二区 | 青娱乐伊人 | 一级特黄色大片 | 一本到亚洲网 | 欧美日本一区二区 | 福利片中文 | 性欧美性另类双性人互交 | 亚洲精品高清国产一久久 | 欧美日韩国产一区二区三区不卡 | 亚洲人成图片欧美人成图片 | 精品国产一级毛片 | 欧美做爱毛片 | 最近免费字幕中文大全在线观看 | 自拍视频一区二区 | 久久久夜| 成人网在线视频 | 亚洲精品老司机在线观看 | 婷婷欧美 | 操你啦网站 | 97热久久免费频精品99国产成人 | 亚洲图片欧美小说 | 69视频网址| 亚洲操操 | 真实男女xx00动态视频120秒 | 精品欧美一区二区在线看片 | 亚洲欧美在线精品 | 日本1区2区 | 中文字幕动漫精品专区 | 黄色一区二区三区 | 在线观看视频网站www色 | 最新18videosex性欧美少 | 大香伊人久久 | 国产成人永久免费视 | 最新国产福利在线观看 | 欧美日韩在线观看免费 | 国产欧美成人不卡视频 | 日韩一区国产二区欧美三区 | 日本在线观看www |