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

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > PHP引用傳遞與引用&一些用法介紹

PHP引用傳遞與引用&一些用法介紹

來源:程序員人生   發(fā)布時(shí)間:2014-05-15 20:12:44 閱讀次數(shù):2436次

引用是什么

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

引用做什么

PHP 的引用允許用兩個(gè)變量來指向同一個(gè)內(nèi)容。

當(dāng) $a =& $b; 時(shí) $a 和 $b 指向了同一個(gè)變量。

提示:$a 和 $b 在這里是完全相同的,這并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一個(gè)地方。

可以將一個(gè)變量通過引用傳遞給函數(shù),這樣該函數(shù)就可以修改其參數(shù)的值,語法如下:

  1. <?php  
  2. function foo(&$var)  
  3. {  
  4.     $var++;  
  5. }  
  6.    
  7. $a=5;  
  8. foo($a);  
  9. echo $a
  10. // 輸出的是:6 

PHP引用符&

關(guān)于php的引用(就是在變量或者函數(shù)、對(duì)象等前面加上&符號(hào))的作用,我們先看下面這個(gè)程序。代碼如下:

  1. <?php 
  2. $a = 100; //聲明變量a 
  3. $b = &$a//聲明變量b,引用自變量a 
  4. echo "$a <br />";   
  5. echo "$b <br />"
  6. $a++; //變量a自增1 
  7. echo "$a <br />"
  8. echo "$b <br />";//查看變量b,也增加了1,說明使用的是同一存儲(chǔ)單元 
  9. ?> 
  10. //程序運(yùn)行結(jié)果: 
  11. //100  
  12. //100  
  13. //101  
  14. //101 

很多人誤解php中的引用跟C當(dāng)中的指針一樣,事實(shí)上并非如此,而且很大差別。C語言中的指針除了在數(shù)組傳遞過程中不用顯式申明外,其他都需要使用*進(jìn)行定義,而php中對(duì)于地址的指向(類似指針)功能不是由用戶自己來實(shí)現(xiàn)的,是由Zend核心實(shí)現(xiàn)的,php中引用采用的是“寫時(shí)拷貝”的原理,就是除非發(fā)生寫操作,指向同一個(gè)地址的變量或者對(duì)象是不會(huì)被拷貝的。

php默認(rèn)為傳值傳遞,代碼如下:

  1. <?php     
  2. $a = 20; 
  3. $b = $a
  4. $a = $a + 10;  
  5. echo $a.' and '.$b;  
  6. ?> 
  7. //程序運(yùn)行結(jié)果: 
  8. //30 and 20 

要是想變?yōu)榈刂穫鬟f需要加&,既代碼如下:

  1. <?php 
  2. $a = 20; 
  3. $b = &$a;  
  4. $a = $a + 10;  
  5. echo $a.' and '.$b;  
  6. ?> 

就是說,&把$a的地址傳給了$b,這樣的話這兩個(gè)變量現(xiàn)在共享一個(gè)內(nèi)存的存儲(chǔ)區(qū)域,就是說它們的值是一樣的。

同樣的語法可以用在函數(shù)中,它返回引用,以及用在 new 運(yùn)算符中,代碼如下:

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

引用做的第二件事是用引用傳遞變量,這是通過在函數(shù)內(nèi)建立一個(gè)本地變量,并且該變量在呼叫范圍內(nèi)引用了同一個(gè)內(nèi)容來實(shí)現(xiàn)的,說的通俗點(diǎn)就是一個(gè)函數(shù)的參數(shù)是一個(gè)本地變量的引用,下面再舉例說明一下:

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

運(yùn)行這段代碼是給函數(shù)傳遞兩個(gè)參數(shù),一個(gè)是引用$a的內(nèi)容,一個(gè)是$b的值,在執(zhí)行此函數(shù)后,發(fā)現(xiàn)$a的內(nèi)容改變了,而$b的內(nèi)容則沒有變化。

PHP引用以及誤區(qū)

PHP中的引用可以理解成變量的別名,由于PHP的變量名是存儲(chǔ)在符號(hào)表(symbol table)中的,變量內(nèi)容是存儲(chǔ)在堆中,引用就是用符號(hào)表中的不同符號(hào)(symbol)名稱來訪問同一存儲(chǔ)內(nèi)容,和Unix文件系統(tǒng)中的hardlink是同一個(gè)概念,比如實(shí)例代碼如下:

  1. <?php 
  2. $a = 1; 
  3. $b = &$a//$a與$b指向同一內(nèi)容 
  4. $b = 2; 
  5. echo $b//2 
  6. echo $a//2 
  7. ?> 

傳遞引用

引用傳遞很簡單,就是一個(gè)「&」符號(hào),比如如下代碼:

  1. <?php 
  2. function foo(&$a) { 
  3.   $a = 2; 
  4. $b = 1; 
  5. foo($b); 
  6. echo $b//2 
  7. ?> 

返回引用

大多數(shù)情況下并不需要返回引用來提高性能,zend引擎會(huì)自己進(jìn)行優(yōu)化,但是如果你非得返回引用得話,可以按照以下方式來返回引用,代碼如下:

  1. <?php 
  2. class foo { 
  3.     public $value = 42; 
  4.     public function &getValue() { // 需要一個(gè)"&" 
  5.         return $this->value; 
  6.     } 
  7. $obj = new foo; 
  8. $myValue = &$obj->getValue(); // 還需要一個(gè)"&",$myValue是對(duì)class foo中的$value的引用 
  9. $obj->value = 2;              // 修改對(duì)象的$value屬性 
  10. echo $myValue;                // 輸出2,$myValue與class foo中的$value值相同 
  11. ?> 

與指針的區(qū)別

引用與指針很像,但是其并不是指針,看如下的代碼:

  1. <?php 
  2.     $a = 0; 
  3.     $b = &a; 
  4.     echo $a//0 
  5.     unset($b); 
  6.     echo $a//0 
  7. ?> 

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

  1. #include <stdio.h> 
  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: pointer being freed was not allocated 

由于b是指向a的指針,所以釋放了b的內(nèi)存之后,再訪問a就會(huì)出現(xiàn)錯(cuò)誤,比較明顯的說明了PHP引用與C指針的區(qū)別。

對(duì)象與引用

在PHP中使用對(duì)象的時(shí)候,大家總是被告知“對(duì)象是按照引用傳遞的”,其實(shí)這是個(gè)誤區(qū),PHP的對(duì)象變量存儲(chǔ)的是此對(duì)象的一個(gè)標(biāo)示符,在傳遞對(duì)象的時(shí)候,其實(shí)傳遞的就是這個(gè)標(biāo)示符,而并不是引用,看如下代碼:

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

如果對(duì)象是按照引用傳遞的,那么$a, $b, $c輸出的內(nèi)容應(yīng)該一樣,事實(shí)上結(jié)果并非如此,看下面通過引用傳遞對(duì)象的列子:

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

此時(shí)$aa,$bb,$cc三者內(nèi)容完全一樣,所以可以看出對(duì)象并不是按照引用傳遞,要盡快走出這個(gè)誤區(qū).

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产精品爽爽爽爽爽爽在线观看 | 亚洲国产区 | 国产精品午夜一区 | 最新日韩电影 | 国产一区二区三区色淫影院 | 日韩城人免费 | 国产在线一区二区三区视频 | 亚洲免费小视频 | 国产在线小视频 | 国产精品hongkong在线 | 日本精品中文字幕 | 成人免费在线观看 | 久久久亚洲一区 | 日本三级视频在线播放 | 日韩精品一区二区三区四区 | 国产视频在线看 | 亚洲福利网站 | 91视频导航| 色先锋在线 | 欧美一区二区三区在线观看视频 | 国产97在线 | 免费 | 国产精品无码专区在线观看 | 日韩福利一区二区 | 国产黄色在线看 | 久久精品国产色蜜蜜麻豆 | 久久国产精品-国产精品 | 夜间av免费看精品 | 精品国产乱码久久久久久丨区2区 | av在线成人 | 免费中文字幕在线 | 成人在线免费网站 | 久久99精品久久久久久按摩秒播 | 一区二区久久久 | 亚洲一区二区三区精品视频 | 日韩激情网 | 天堂av一区二区 | 国产一区二区在线免费观看 | 成 人色 网 站 欧美大片在线观看 | 69精品 | 国产亚州av | 91久久久一线二线三线品牌 |