PHP中存在著值傳遞和引用傳遞。後者需要使用地址符&來標識變數。使用賦值操作舉例說明如下:
1、值傳遞
1)基礎資料型別 (Elementary Data Type):
<?php$a = 1;$b = $a;$b += 2;echo "\$a = ".$a."<br />";echo "\$b = ".$b."<br />";/* 輸出:$a = 1$b = 3*/?>
註:這裡使用了$b = $a語句,是將$a的值賦給了$b。 即此時賦的值是1。
執行語句$b += 2後:
所以,$b變成了3,但是$a的值並沒有改變。
2)引用資料類型
Person類如下:
<?php class Person {private $_name;public function setName($name) {$this->_name = $name;}public function getName() {return $this->_name;}public function toString() {return "name is ".$this->_name;}}?>
初始化兩個Person類對象,並設定屬性:
3 |
$p2 = new Person(); |
4 |
$p2->setName("person2"); |
執行以下操作:
測試:
1 |
echo "\$p1's ".$p1->toString().".<br />"; |
2 |
echo "\$p3's ".$p3->toString().".<br />"; |
5 |
$p1's name is person1. |
6 |
$p3's name is person1. |
註: 對於 $p3 = $p1語句, 即此時賦的值是0x000a。 即$p1和$p3都引用了同一個對象。
2、引用傳遞
1)基礎資料型別 (Elementary Data Type)
05 |
|
06 |
echo "\$a = ".$a."<br />"; |
07 |
echo "\$b = ".$b."<br />"; |
08 |
|
註:這裡使用$b = &$a語句,進行了引用傳遞: 即此時賦的值是0x0001。
所以對$b += 2後,
所以$a和$b的值都是3。
2)引用資料類型
若執行的是以下操作來替代之前的$p3 = $p1
再執行以下操作:
測試結果如下:
1 |
echo "\$p1's ".$p1->toString().".<br />"; |
2 |
echo "\$p3's ".$p3->toString().".<br />"; |
5 |
$p1's name is person2. |
6 |
$p3's name is person2. |
註:對已列印出$p3的結果資訊是很明了的,因為執行了$p3 = $p2語句,但是為什麼列印$p1的結果資訊與之前相比不一樣了呢?
是因為$p3 = &$p1語句執行後, 即此時賦的值是0x0001。
緊接著執行$p3 = $p2語句後
所以才會列印出如上的結果資訊,這便是地址符&在起作用。
完整代碼如下:
1)引用資料類型
01 |
<?php |
02 |
class Person { |
05 |
public function setName($name) { |
06 |
$this->_name = $name; |
09 |
public function getName() { |
10 |
return $this->_name; |
13 |
public function toString() { |
14 |
return "name is ".$this->_name; |
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)基礎資料型別 (Elementary Data Type)
3 |
$b = $a; |
4 |
// $b = &$a; |
7 |
echo "\$a = ".$a."<br />"; |
8 |
echo "\$b = ".$b."<br />"; |
結束語:對於值傳遞與引用傳遞在方法/函數參數的傳遞上情況下,與賦值操作情況是類似的。