PHP裡的值傳遞與引用傳遞

PHP中存在著值傳遞和引用傳遞。後者需要使用地址符&來標識變量。使用賦值操作舉例說明如下:

1、值傳遞

1)基本數據類型:

01
<?php
02
    $a = 1;
03
    $b = $a;
04
    $b += 2;
05
    
06
    echo "\$a = ".$a."<br />";
07
    echo "\$b = ".$b."<br />";
08
    
09
    /* 輸出:
10
        $a = 1
11
        $b = 3
12
    */
13
?>
註:這裡使用瞭$b = $a語句,是將$a的值賦給瞭$b。 即此時賦的值是1。 
 
執行語句$b += 2後:
 
所以,$b變成瞭3,但是$a的值並沒有改變。

2)引用數據類型

Person類如下:

01
class Person {
02
    private $_name;
03
    
04
    public function setName($name) {
05
        $this->_name = $name;
06
    }
07
    
08
    public function getName() {
09
        return $this->_name;
10
    }
11
    
12
    public function toString() {
13
        return "name is ".$this->_name;
14
    }
15
}
初始化兩個Person類對象,並設置屬性:

1
$p1 = new Person();
2
$p1->setName("person1");
3
$p2 = new Person();
4
$p2->setName("person2");
執行以下操作:

1
$p3 = $p1;
測試:

1
echo "\$p1's ".$p1->toString().".<br />";
2
echo "\$p3's ".$p3->toString().".<br />";
3
 
4
/* 輸出:
5
    $p1's name is person1.
6
    $p3's name is person1.
7
*/
註: 對於 $p3 = $p1語句,     即此時賦的值是0x000a。  即$p1和$p3都引用瞭同一個對象。
 

2、引用傳遞

1)基本數據類型

01
<?php
02
    $a = 1;
03
    $b = &$a;
04
    $b += 2;
05
    
06
    echo "\$a = ".$a."<br />";
07
    echo "\$b = ".$b."<br />";
08
    
09
    /* 輸出:
10
        $a = 3
11
        $b = 3
12
    */
13
?>
註:這裡使用$b = &$a語句,進行瞭引用傳遞:   即此時賦的值是0x0001。 

 
所以對$b += 2後,

 

所以$a和$b的值都是3。

2)引用數據類型

若執行的是以下操作來替代之前的$p3 = $p1

1
$p3 = &$p1;
再執行以下操作:

1
$p3 = $p2;
測試結果如下:

1
echo "\$p1's ".$p1->toString().".<br />";
2
echo "\$p3's ".$p3->toString().".<br />";
3
 
4
/* 輸出:
5
    $p1's name is person2.
6
    $p3's name is person2.
7
*/
註:對已打印出$p3的結果信息是很明瞭的,因為執行瞭$p3 = $p2語句,但是為什麼打印$p1的結果信息與之前相比不一樣瞭呢?

是因為$p3 = &$p1語句執行後,  即此時賦的值是0x0001。


緊接著執行$p3 = $p2語句後


所以才會打印出如上的結果信息,這便是地址符&在起作用。

完整代碼如下:

1)引用數據類型

01
<?php
02
    class Person {
03
        private $_name;
04
        
05
        public function setName($name) {
06
            $this->_name = $name;
07
        }
08
        
09
        public function getName() {
10
            return $this->_name;
11
        }
12
        
13
        public function toString() {
14
            return "name is ".$this->_name;
15
        }
16
    }
17
        
18
    $p1 = new Person();
19
    $p1->setName("person1");
20
    $p2 = new Person();
21
    $p2->setName("person2");
22
    
23
    $p3 = $p1;
24
    // $p3 = &$p1;
25
    // $p3 = $p2;
26
    echo "\$p1's ".$p1->toString().".<br />";
27
    echo "\$p3's ".$p3->toString().".<br />";
28
?>
2)基本數據類型

 
1
<?php
2
    $a = 1;
3
    $b = $a;
4
    // $b = &$a;
5
    $b += 2;
6
    
7
    echo "\$a = ".$a."<br />";
8
    echo "\$b = ".$b."<br />";
9
?>
結束語:對於值傳遞與引用傳遞在方法/函數參數的傳遞上情況下,與賦值操作情況是類似的。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *