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
?>
結束語:對於值傳遞與引用傳遞在方法/函數參數的傳遞上情況下,與賦值操作情況是類似的。