<?php /** * 在PHP 中引用的意思是用不同的名字訪問同一個變量內容 * 只有有名字的變量才可以引用賦值,否則會報錯 * 引用賦值 不是在內存上同體,只是把各自的值關聯起來 * unset不會導致所有引用變量消失 */ $a = 10; $b = &$a; // 引用賦值 echo $b,'<hr>'; // 10 function test(){ return 20; } $b = &test(); echo $b,'<hr>'; // 20 function &test2(){ return 30; // 30 } $b = test2(); echo $b,'<hr>'; unset($a); echo $b; // 函數的傳址調用 function test3(&$a) { $a +=100; } $b=1; echo $b;//輸出1 test3($b); //這里$b傳遞給函數的其實是$b的變量內容所處的內存地址,通過在函數里改變$a的值 就可以改變$b的值了 echo "<br>"; echo $b;//輸出101 // 函數的引用返回 function &test4() { static $b = 0;//申明一個靜態變量 $b = $b + 1; echo $b; return $b; } $a=test4();//這條語句會輸出 $b的值 為1 $a=5; $a=test4();//這條語句會輸出 $b的值 為2 $a=&test4();//這條語句會輸出 $b的值 為3 $a=5; $a=test4();//這條語句會輸出 $b的值 為6 /* 通過這種方式$a=test();得到的其實不是函數的引用返回,這跟普通的函數調用沒有區別 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 這里是為了讓大家理解函數的引用返回才使用靜態變量的,其實函數的引用返回多用在對象中 */ // 對象的調用 class a{ var $abc="ABC"; } $b=new a; $c=$b; echo $b->abc;//這里輸出ABC echo $c->abc;//這里輸出ABC $b->abc="DEF"; echo $c->abc;//這里輸出DEF /* 在PHP中,對象的復制是通過引用來實現的。 上列中$b=new a; $c=$b; 其實等效於$b=new a; $c=&$b; PHP中默認就是通過引用來調用對象, 但有時你可能想建立一個對象的副本,並希望原來的對象的改變不影響到副本。 為了這樣的目的,PHP定義了一個特殊的方法,稱為__clone. 引用的作用 如果程序比較大,引用同一個對象的變量比較多,並且希望用完該對象后手工清除它時使用 "&" 方式,然后用$var=null的方式清除。 另外,php中對於大數組的傳遞,建議用 "&" 方式,可以節省內存空間使用。 取消引用 當你 unset 一個引用,只是斷開了變量名和變量內容之間的綁定。這並不意味着變量內容被銷毀了。 */
案例:
<?php $data = ['a', 'b', 'c']; foreach($data as $key => $val) { $val = &$data[$key]; } var_dump($data); /** * $key 0 $val = a $val = &$data[0] * * $key 1 $val = $data[0] = b $val = &data[1] * * $key 2 $val = $data[1] = c $val = &data[2] * * 輸出 b c c */