php中按值傳遞和按引用傳遞的一個問題

  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也就沒有了屬性值。

相關文章
相關標籤/搜索