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

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > php中引用(變量和函數名前加&符號)用法

php中引用(變量和函數名前加&符號)用法

來源:程序員人生   發布時間:2013-11-03 00:00:55 閱讀次數:6610次

本文章來給大家介紹在php中我們??吹皆谠趐hp變量前面加個&符號,這個就是php中引用符號了,它可以用于各種變量、函數、對象了下面我來給各位詳細介紹php&符號用法.在 PHP 中引用意味著用不同的名字訪問同一個變量內容.這并不像 C 的指針,它們是符號表別名.注意在 PHP 中,變量名和變量內容是不一樣的,因此同樣的內容可以有不同的名字.PHP的引用是通過在變量名或者函數名前加&符號來實現的.下面解釋一下引用的幾種用法:

先來看官方法的說明:

引用做什么

PHP 的引用允許用兩個變量來指向同一個內容.意思是,當這樣做時:

  1. $a =& $b
  2. ?>  

這意味著 $a 和 $b 指向了同一個變量. 

Note:

$a 和 $b 在這里是完全相同的,這并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一個地方.

Note:

如果具有引用的數組被拷貝,其值不會解除引用.對于數組傳值給函數也是如此.

Note:

如果對一個未定義的變量進行引用賦值、引用參數傳遞或引用返回,則會自動創建該變量.Example #1 對未定義的變量使用引用:

  1. function foo(&$var) { } 
  2. foo($a); // $a is "created" and assigned to null 
  3. $b = array(); 
  4. foo($b['b']); 
  5. var_dump(array_key_exists('b'$b)); // bool(true) 
  6. $c = new StdClass; 
  7. foo($c->d); 
  8. var_dump(property_exists($c'd')); // bool(true) 
  9. ?> 

同樣的語法可以用在函數中,它返回引用,以及用在 new 運算符中(PHP 4.0.4 以及以后版本)

  1. $bar =& new fooclass(); 
  2. $foo =& find_var($bar); 
  3. ?>  

自 PHP 5 起,new 自動返回引用,因此在此使用 =& 已經過時了并且會產生 E_STRICT 級別的消息.

Note:

不用 & 運算符導致對象生成了一個拷貝.如果在類中用 $this,它將作用于該類當前的實例.沒有用 & 的賦值將拷貝這個實例(例如對象)并且 $this 將作用于這個拷貝上,這并不總是想要的結果.由于性能和內存消耗的問題,通常只想工作在一個實例上面.盡管可以用 @ 運算符來抑制構造函數中的任何錯誤信息,例如用 @new,但用 &new 語句時這不起效果.這是 Zend 引擎的一個限制并且會導致一個解析錯誤.

首先是變量的簡單引用,允許你用兩個變量來指向同一個內容,舉個簡單的例子:

  1. $a = 5; 
  2. $b = &$a
  3. echo $b
  4. $a++; 
  5. echo $b
  6. ?> 

運行這段代碼是讓$b來引用$a的內容,然后改變$a的內容,$b的內容也會隨之變化.同樣的語法可以用在函數中,它返回引用,以及用在new 運算符中:

  1. $bar =& new fooclass(); 
  2. $foo =& find_var ($bar); 
  3. ?> 

引用做的第二件事是用引用傳遞變量.這是通過在函數內建立一個本地變量,并且該變量在呼叫范圍內引用了同一個內容來實現的.

說的通俗點就是一個函數的參數是一個本地變量的引用.下面再舉例說明一下:

  1. function foo(&$val1$val2) { 
  2. $val1 += 1; 
  3. $val2 += 1; 
  4. $a=5; 
  5. $b=10; 
  6. foo($a,$b); 
  7. echo $a
  8. echo $b
  9. ?> 

運行這段代碼是給函數傳遞兩個參數,一個是引用$a的內容,一個是$b的值,在執行此函數后,發現$a的內容改變了,而$b的內容則沒有變化.PHP引用的第三個用法是引用返回,這個用法理解起來有點難度,引用返回用在當你想用函數找到引用應該被綁定在哪一個變量上面時.當返回引用時,使用此語法:說的簡單點,就還是引用函數的返回.但和參數傳遞不同,必須在函數定義和函數引用這兩個地方都用 & 符號.下面舉個例子:

  1. function &find_var ($param
  2.     /* ...code... */ 
  3.     return $found_var
  4. $foo =& find_var ($bar); 
  5. $foo->x = 2; 
  6. ?> 

這個例子給$foo 賦值是函數find_var的返回引用,所以在給$foo->x賦值時就是給find_var的返回引用賦值,而不是簡單的賦值.PHP引用的最后一個用法是引用定位,主要有兩個應用:一個是global 引用,當用 global $var 聲明一個變量時實際上建立了一個到全局變量的引用.也就是和$var =& $GLOBALS["var"];是一樣的.另外一個是$this的用法,在一個對象的方法中,$this 永遠是調用它的對象的引用.與指針的區別引用與指針很像,但是其并不是指針.

看如下的代碼:

  1.     $a = 0; 
  2.     $b = &a; 
  3.     echo $a//0 
  4.     unset($b); 
  5.     echo $a//0 

由于$b只是$a的別名,所以即使$b被釋放了,$a沒有任何影響,但是指針可不是這樣的.

看如下代碼:

  1. #include  
  2. int main(int argc, char const *argv[]) { 
  3.     int a = 0; 
  4.     int* b = &a; 
  5.     printf("%in", a); //0 
  6.     free(b); 
  7.     printf("%in", a); //*** error for object 0x7fff6350da08:  
  8.  
  9. pointer being freed was not allocated 

由于b是指向a的指針,所以釋放了b的內存之后,再訪問a就會出現錯誤,比較明顯的說明了PHP引用與C指針的區別.

對象與引用

在PHP中使用對象的時候,大家總是被告知"對象是按照引用傳遞的",其實這是個誤區.PHP的對象變量存儲的是此對象的一個標示符,在傳遞對象的時候,其實傳遞的就是這個標示符,而并不是引用.

看如下代碼:

  1. $a = new A; 
  2. $b = $a;     
  3. $b->testA = 2; 
  4. /* 
  5.  * 此時$a,$b的關系: 
  6.  *        +-----------+      +-----------------+ 
  7.  * $a --> | object id | ---> | object(Class A) | 
  8.  *        +-----------+      +-----------------+ 
  9.  *                               ^ 
  10.  *        +-----------+          | 
  11.  * $b --> | object id | ---------+ 
  12.  *        +-----------+     
  13.  * 
  14.  * 
  15.  */ 
  16. $c = new B; 
  17. $a = $c
  18. $a->testB = "Changed Class B"
  19. /* 
  20.  * 此時$a,$b,$c的關系: 
  21.  *        +-----------+      +-----------------+ 
  22.  * $b --> | object id | ---> | object(Class A) | 
  23.  *        +-----------+      +-----------------+ 
  24.  *                                
  25.  *        +------------+           
  26.  * $a --> | object id2 | -------------+ 
  27.  *        +------------+              | 
  28.  *                                    v 
  29.  *        +------------+      +-----------------+ 
  30.  * $c --> | object id2 | ---> | object(Class B) | 
  31.  *        +------------+      +-----------------+ 
  32.  */ 
  33. echo "object a: "; var_dump($a); //["testB"]=> string(15)  
  34.  
  35. "Changed Class B" 
  36. echo "object b: "; var_dump($b); //["testA"] => int(2) 
  37. echo "object c: "; var_dump($c); //["testB"]=> string(15)  
  38.  
  39. "Changed Class B" 

如果對象是按照引用傳遞的,那么$a,$b, $c輸出的內容應該一樣,事實上結果并非如此.看下面通過引用傳遞對象的列子:

  1. $aa = new A; 
  2. $bb = &$aa;  // 引用  
  3. $bb->testA = 2; 
  4. /* 
  5.  * 此時$aa, $bb的關系: 
  6.  * 
  7.  *         +-----------+      +-----------------+ 
  8.  * $bb --> | object id | ---> | object(Class A) | 
  9.  *         +-----------+      +-----------------+ 
  10.  *              ^                   
  11.  *              | 
  12.  * $aa ---------+  
  13.  * 
  14.  * 
  15.  */ 
  16. $cc = new B; 
  17. $aa = $cc
  18. $aa->testB = "Changed Class B"
  19. /* 
  20.  * 此時$aa, $bb, $cc的關系: 
  21.  * 
  22.  *         +-----------+      +-----------------+ 
  23.  *         | object id | ---> | object(Class A) | 
  24.  *         +-----------+      +-----------------+ 
  25.  *               
  26.  * $bb ---->-----+       
  27.  *               | 
  28.  * $aa ---->-----+ 
  29.  *               |   
  30.  *               v    
  31.  *         +------------+       
  32.  *         | object id2 | --------------+  
  33.  *         +------------+               | 
  34.  *                                      v 
  35.  *         +------------+      +-----------------+ 
  36.  * $cc --> | object id2 | ---> | object(Class B) | 
  37.  *         +------------+      +-----------------+ 
  38.  */ 
  39. echo "object aa: "; var_dump($aa); //["testB"]=>string(15)  
  40.  
  41. "Changed Class B" 
  42. echo "object bb: "; var_dump($bb); //["testB"]=>string(15)  
  43.  
  44. "Changed Class B" 
  45. echo "object cc: "; var_dump($cc); //["testB"]=>string(15)  
  46.  
  47. "Changed Class B" 

此時$aa,$bb,$cc三者內容完全一樣,所以可以看出對象并不是按照引用傳遞,要盡快走出這個誤區.


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 午夜视频在线免费 | 校园春色欧美色图 | 国内视频一区二区三区 | 国产精品区一区二区三 | 中文乱码精品一区二区三区 | 欧美一区二区三区国产精品 | 久久久久综合国产 | 免费aⅴ网站 | 啪一啪在线视频 | 在线观看麻豆 | 波多野结衣免费在线视频 | 亚洲国产欧美在线人网站 | 大杳蕉伊人狼人久久一本线 | 亚洲免费一区二区 | 久久久国产精品免费看 | 欧美一区二区三区久久综合 | 99成人在线视频 | 亚洲精品专区一区二区欧美 | 国产欧美日韩综合精品一区二区三区 | 亚洲最大中文字幕 | 一区二区精品 | a色网站| 午夜影院色| 亚洲欧美日韩国产一区二区精品 | 日本一级毛片免费 | 日本free护士videosxxxx动漫 | 国产第一页在线播放 | 日本视频中文字幕一区二区 | 色噜噜狠狠先锋影音久久 | 亚洲综合综合在线 | 国产97色在线 | 亚洲 | 啪啪大片 | 手机免费在线视频 | 国产成人精品一区二区三区 | 12306播播影视播播影院午夜 | 亚州黄色 | 亚洲三级图片 | 精品自拍视频在线观看 | 亚洲精品高清国产一久久 | 欧美另类亚洲 | 欧美性大战久久久久久 |