php中傳遞變量默認是按照值傳遞。php
簡單舉個例子:數組
1 <?php 2 3 function testArray($arr){// &$arr 4 $arr = array(1,2,3,); 5 } 6 7 $array = array(4, 5); 8 9 testArray($array); 10 11 print_r($array);// Array ( [0] => 4 [1] => 5 )
若是testArray的參數寫成$arr,那麼數組$array的結果不會變。證實是按照值傳遞。函數
若是參數強制改爲引用傳遞,函數參數要寫成&$arr,結果纔是Array ( [0] => 1 [1] => 2 [2] => 3 )this
再舉一個對象的例子:spa
1 <?php 2 3 class Person{ 4 public $age = 0; 5 function __construct($age) 6 { 7 $this->age = $age; 8 } 9 } 10 11 function testObj1($p){ 12 $p->age = 2; 13 } 14 15 function testObj2($p){ 16 $p = null; 17 } 18 19 function testObj3(&$p){ 20 $p = null; 21 } 22 23 $p1 = new Person(1); 24 25 echo $p1->age,'<br/>';// 1 26 27 testObj1($p1); 28 echo $p1->age,'<br/>';// 2 29 30 testObj2($p1); 31 echo $p1->age,'<br/>';// 2 32 33 testObj3($p1); 34 echo $p1->age,'<br/>';// null
對象也依然是按照值傳遞。這個值是棧區的地址。code
有人會說,爲何按照值傳遞,28行還會是2。對象
若是用個堆棧模型演示一下就很明白了,$p1這個變量是存在棧區,它存放了一塊地址,這塊地址指向了堆區裏的對象。blog
此時調用了testObj1()函數,那麼會在函數棧裏面,再生成一個$p變量,它也存放了一塊地址,這個地址和$p1存放的地址相同,表示$p也指向堆區的那個位置。因此說改變$p堆的對象屬性,$p1也跟着變。io
當調用testObj2()函數時,它讓函數棧區的$p指向了空,可是它並無改變$p1的指向,$p1仍然指向的那塊堆地址。因此仍然是2。function
當調用testObj3()函數時,函數取的是$p1的地址(注意區別,$p1自己在棧裏是有個地址的,它存放的數據也是個地址,這兩個地址是不同的),直接操縱了$p1,表示讓$p1指向空。所以$p1也就沒有了屬性值。