在php中使用引用賦值只需要在原始對象前加個&就可以了,$a = &$b;其實php中的引用就是兩個不同名稱的變量指向同一個值。
引用是什么
在 PHP 中引用意味著用不同的名字訪問同一個變量內容。這并不像 C 的指針,替代的是,引用是符號表別名。注意在 PHP 中,變量名和變量內容是不一樣的,因此同樣的內容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——變量名是目錄條目,而變量內容則是文件本身。引用可以被看作是 Unix 文件系統中的 hardlink。
一:變量的引用,代碼如下:
- <?php
- $a =100;
- $b = &$a;
- echo $b; //這里輸出100
- echo $a; //這里輸出100 ,說明$a,和$b的值都是一百。
- $b= 200;
- echo $a; //這里輸出200
- echo $b; //這里輸出200,這就可以看出他們用的是同一個地址。改變一個,另一個也會跟著改變。
- ?>
二:函數中引用傳值,代碼如下:
- <?php
- function main($a,$b){
- $b= $a+100;
- return $b;
- }
- main(55,&$b); //這里的$b其實就是把它的內存地址傳遞給函數main中的$b參數,通過參數$b的改變而改變外面的$b的值。
- echo $b; //這里會輸出155,
- ?>
三:對象的引用傳值,對象的引用,代碼如下:
- <?
- class club{
- var $name="real madrid";
- }
- $b=new club;
- $c=$b;
- echo $b->name;//這里輸出real madrid
- echo $c->name;//這里輸出real madrid
- $b->name="ronaldo";
- echo $c->name;//這里輸出ronaldo
- ?>
取消引用:當你 unset 一個引用,只是斷開了變量名和變量內容之間的綁定,這并不意味著變量內容被銷毀了,例如如下代碼:
- <?php
- $a = 'ronaldo'
- $b =&$a;
- unset ($a);
- ?>
不會 unset $b,只是 $a,例,引用傳遞,test1.php,代碼如下:
- <?php
- /**
- * 引用傳遞
- 以下內容可以通過引用傳遞:
- 變量,例如 foo($a)
- New 語句,例如 foo(new foobar())
- 從函數中返回的引用,例如:
- */
- function foo(&$var)
- {
- $var++;
- }
- $a=5;
- //合法
- foo($a);
- foo(new stdClass());
- //非法使用
- function bar() // Note the missing &
- {
- $a = 5;
- return $a;
- }
- foo(bar()); // 自 PHP 5.0.5 起導致致命錯誤
- foo($a = 5) // 表達式,不是變量
- foo(5) // 導致致命錯誤
- ?>
test2.php,代碼如下:
- <?php
- function test(&$a)
- {
- $a=$a+100;
- }
- $b=1;
- echo $b;//輸出1
- test($b); //這里$b傳遞給函數的其實是$b的變量內容所處的內存地址,通過在函數里改變$a的值 就可以改變$b的值了
- echo "<br>";
- echo $b;//輸出101
- /*****************************
- *
- * 這里需要注意 call_user_func_array 后的參數是需要 &
- *
- * ****************************/
- //上面的“ test($b); ” 中的$b前面不要加 & 符號,但是在函數“call_user_func_array”中,若要引用傳參,就得需要 & 符號,如下代碼所示:
- function a(&$b){
- $b++;
- }
- $c=0;
- call_user_func_array('a',array(&$c));
- echo $c;
- //輸出 1
- ?>
引用返回
引用返回用在當想用函數找到引用應該被綁定在哪一個變量上面時,不要用返回引用來增加性能,引擎足夠聰明來自己進行優化,僅在有合理的技術原因時才返回引用!要返回引用,使用此語法,代碼如下:
- <?php
- function &test()
- {
- static $b=0;//申明一個靜態變量
- $b=$b+1;
- echo $b;
- return $b;
- }
- $a=test();//這條語句會輸出 $b的值 為1
- $a=5;
- $a=test();//這條語句會輸出 $b的值 為2
- $a=&test();//這條語句會輸出 $b的值 為3 這里將return $b中的 $b變量的內存地址與$a變量的內存地址 指向了同一個地方
- $a=5; //已經改變了 return $b中的 $b變量的值
- $a=test();//這條語句會輸出 $b的值 為6
- /**
- ?>
下面解釋下:
通過這種方式$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上看到的,代碼如下:
- <?php
- $a = array('abe','ben','cam');
- foreach ($a as $k=>&$n)
- $n = strtoupper($n);
- foreach ($a as $k=>$n) // notice NO reference here!
- echo "$nn";
- print_r($a);
- ?>
- will result in:
- ABE
- BEN
- BEN
- Array
- (
- [0] => ABE
- [1] => BEN
- [2] => BEN
- )
- //解釋: 在第二個foreach中循環如下:
- Array
- (
- [0] => ABE
- [1] => BEN
- [2] => ABE
- )
- Array
- (
- [0] => ABE
- [1] => BEN
- [2] => BEN
- )
- Array
- (
- [0] => ABE
- [1] => BEN
- [2] => BEN
- )
因為沒有unset($n),所以它始終指向數組的最后一個元素,第二個foreach里第一次循環把$n,也就是$a[2]改成了ABE,第二次循環改成了BEN,第三次就也是BEN了。
新聞熱點
疑難解答