1.變量的引用
PHP 的引用 兩個變量的指針指向同一內存地址
$a="ABC"; $b =&$a; echo $a;//這裡輸出:ABC echo $b;//這裡輸出:ABC $b="EFG"; echo $a;//這裡$a的值變為EFG 所以輸出EFG echo $b;//這裡輸出EFG
2.函數的引用傳遞(傳址調用)
function test(&$a) { $a=$a+100; } $b=1; echo $b;//輸出1 test($b); //這裡$b傳遞給函數的其實是$b的變量內容所處的內存地址,通過在函數裡改變$a的值 就可以改變$b的值了 echo "<br>"; echo $b;//輸出101 ?>
3.函數的引用返回
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 $a=5; $a=test();//這條語句會輸出 $b的值 為6
下面解釋下:
通過這種方式$a=test();得到的其實不是函數的引用返回,這跟普通的函數調用沒有區別 至於原因: 這是php的規定
通過$a=&test()方式調用函數呢, 他的作用是 將return $b中的 $b變量的內存地址與$a變量的內存地址 指向了同一個地方
即產生了相當於這樣的效果($a=&$b;) 所以改變$a的值 也同時改變了$b的值 所以在執行了
4.對象的引用(PHP5)
class foo { public $bar = 1; } $a = new foo; //$a其實也是一個引用 $b = $a; //拷貝引用 ($a)=($b)={id1} $a->bar = 2; echo "b->bar = $b->barn"; $b->bar = 3; echo "a->bar = $a->barn"; //修改了b,但實際上是修改了a和b所引用的同一個對象 //並不會引發 Copy On Write 創建一個新對象b $a = new foo; //$a被修改為一個新的引用,$b沒有改變 //($a)={id2} ($b)={id1} $a->bar = 4; echo "b->bar = $b->barn"; $b = &$a; //顯式地使用引用,b成為“對象的引用”的引用 $a = new foo; //($a)={id3} ($b)=&($a)=&{id3} $a->bar = 5; echo "b->bar = $b->barn" //==output==== b->bar = 2 a->bar = 3 b->bar = 3 b->bar = 5