PHP中存在着值传递和引用传递。后者需要使用地址符&来标识变量。使用赋值操作举例说明如下:
1、值传递
1)基本数据类型:
01 |
02 | $a = 1; |
03 | $b = $a; |
04 | $b += 2; |
05 |
06 |
echo "$a = ".$a." "; |
07 |
echo "$b = ".$b." "; |
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().". "; |
2 |
echo "$p3's ".$p3->toString().". "; |
3 |
4 | /* 输出: |
5 | $p1's name is person1. |
6 | $p3's name is person1. |
7 | */ |
注: 对于 $p3 = $p1语句, 即此时赋的值是0x000a。 即$p1和$p3都引用了同一个对象。
2、引用传递
1)基本数据类型
01 |
02 | $a = 1; |
03 | $b = &$a; |
04 | $b += 2; |
05 |
06 |
echo "$a = ".$a." "; |
07 |
echo "$b = ".$b." "; |
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().". "; |
2 |
echo "$p3's ".$p3->toString().". "; |
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 |
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().". "; |
27 |
echo "$p3's ".$p3->toString().". "; |
28 | ?> |
2)基本数据类型
1 |
2 | $a = 1; |
3 | $b = $a; |
4 | // $b = &$a; |
5 | $b += 2; |
6 |
7 |
echo "$a = ".$a." "; |
8 |
echo "$b = ".$b." "; |
9 | ?> |
结束语:对于值传递与引用传递在方法/函数参数的传递上情况下,与赋值操作情况是类似的。