国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php 引用傳值學習筆記

2024-05-04 21:57:22
字體:
來源:轉載
供稿:網友

在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了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天祝| 建湖县| 郁南县| 包头市| 桃源县| 登封市| 泌阳县| 安新县| 印江| 沙河市| 商河县| 镇雄县| 怀柔区| 安溪县| 江都市| 浑源县| 赫章县| 宁陵县| 武夷山市| 奎屯市| 江川县| 阆中市| 叶城县| 大邑县| 兴安县| 繁昌县| 同心县| 辛集市| 万荣县| 南城县| 青铜峡市| 辽宁省| 吴桥县| 沙河市| 温宿县| 马龙县| 乌拉特后旗| 萍乡市| 荔浦县| 乌恰县| 交城县|