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

首頁(yè) > 開(kāi)發(fā) > PHP > 正文

php中引用(變量和函數(shù)名前加&符號(hào))用法

2024-05-04 21:57:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文章來(lái)給大家介紹在php中我們常看到在在php變量前面加個(gè)&符號(hào),這個(gè)就是php中引用符號(hào)了,它可以用于各種變量、函數(shù)、對(duì)象了下面我來(lái)給各位詳細(xì)介紹php&符號(hào)用法.在 PHP 中引用意味著用不同的名字訪問(wèn)同一個(gè)變量?jī)?nèi)容.這并不像 C 的指針,它們是符號(hào)表別名.注意在 PHP 中,變量名和變量?jī)?nèi)容是不一樣的,因此同樣的內(nèi)容可以有不同的名字.PHP的引用是通過(guò)在變量名或者函數(shù)名前加&符號(hào)來(lái)實(shí)現(xiàn)的.下面解釋一下引用的幾種用法:

先來(lái)看官方法的說(shuō)明:

引用做什么

PHP 的引用允許用兩個(gè)變量來(lái)指向同一個(gè)內(nèi)容.意思是,當(dāng)這樣做時(shí):

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

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

Note:

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

Note:

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

Note:

如果對(duì)一個(gè)未定義的變量進(jìn)行引用賦值、引用參數(shù)傳遞或引用返回,則會(huì)自動(dòng)創(chuàng)建該變量.Example #1 對(duì)未定義的變量使用引用:

  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. ?> 

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

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

自 PHP 5 起,new 自動(dòng)返回引用,因此在此使用 =& 已經(jīng)過(guò)時(shí)了并且會(huì)產(chǎn)生 E_STRICT 級(jí)別的消息.

Note:

不用 & 運(yùn)算符導(dǎo)致對(duì)象生成了一個(gè)拷貝.如果在類中用 $this,它將作用于該類當(dāng)前的實(shí)例.沒(méi)有用 & 的賦值將拷貝這個(gè)實(shí)例(例如對(duì)象)并且 $this 將作用于這個(gè)拷貝上,這并不總是想要的結(jié)果.由于性能和內(nèi)存消耗的問(wèn)題,通常只想工作在一個(gè)實(shí)例上面.盡管可以用 @ 運(yùn)算符來(lái)抑制構(gòu)造函數(shù)中的任何錯(cuò)誤信息,例如用 @new,但用 &new 語(yǔ)句時(shí)這不起效果.這是 Zend 引擎的一個(gè)限制并且會(huì)導(dǎo)致一個(gè)解析錯(cuò)誤.

首先是變量的簡(jiǎn)單引用,允許你用兩個(gè)變量來(lái)指向同一個(gè)內(nèi)容,舉個(gè)簡(jiǎn)單的例子:

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

運(yùn)行這段代碼是讓$b來(lái)引用$a的內(nèi)容,然后改變$a的內(nèi)容,$b的內(nèi)容也會(huì)隨之變化.同樣的語(yǔ)法可以用在函數(shù)中,它返回引用,以及用在new 運(yùn)算符中:

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

引用做的第二件事是用引用傳遞變量.這是通過(guò)在函數(shù)內(nèi)建立一個(gè)本地變量,并且該變量在呼叫范圍內(nèi)引用了同一個(gè)內(nèi)容來(lái)實(shí)現(xiàn)的.

說(shuō)的通俗點(diǎn)就是一個(gè)函數(shù)的參數(shù)是一個(gè)本地變量的引用.下面再舉例說(shuō)明一下:

  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. ?> 

運(yùn)行這段代碼是給函數(shù)傳遞兩個(gè)參數(shù),一個(gè)是引用$a的內(nèi)容,一個(gè)是$b的值,在執(zhí)行此函數(shù)后,發(fā)現(xiàn)$a的內(nèi)容改變了,而$b的內(nèi)容則沒(méi)有變化.PHP引用的第三個(gè)用法是引用返回,這個(gè)用法理解起來(lái)有點(diǎn)難度,引用返回用在當(dāng)你想用函數(shù)找到引用應(yīng)該被綁定在哪一個(gè)變量上面時(shí).當(dāng)返回引用時(shí),使用此語(yǔ)法:說(shuō)的簡(jiǎn)單點(diǎn),就還是引用函數(shù)的返回.但和參數(shù)傳遞不同,必須在函數(shù)定義和函數(shù)引用這兩個(gè)地方都用 & 符號(hào).下面舉個(gè)例子:

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

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

看如下的代碼:

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

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

看如下代碼:

  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的內(nèi)存之后,再訪問(wèn)a就會(huì)出現(xiàn)錯(cuò)誤,比較明顯的說(shuō)明了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. $a = new A; 
  2. $b = $a;     
  3. $b->testA = 2; 
  4. /* 
  5.  * 此時(shí)$a,$b的關(guān)系: 
  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.  * 此時(shí)$a,$b,$c的關(guān)系: 
  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" 

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

  1. $aa = new A; 
  2. $bb = &$aa;  // 引用  
  3. $bb->testA = 2; 
  4. /* 
  5.  * 此時(shí)$aa, $bb的關(guān)系: 
  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.  * 此時(shí)$aa, $bb, $cc的關(guān)系: 
  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" 

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乐至县| 临武县| 神木县| 八宿县| 通城县| 株洲市| 东乡县| 新丰县| 桐乡市| 福贡县| 兴国县| 汝南县| 庆元县| 西藏| 清涧县| 古田县| 澄城县| 芦溪县| 唐河县| 隆德县| 石狮市| 天柱县| 海原县| 富平县| 祁东县| 澄迈县| 安康市| 遂溪县| 平和县| 贺兰县| 民勤县| 惠州市| 汤原县| 教育| 云安县| 泸州市| 资源县| 仙居县| 射阳县| 微博| 宜川县|