PHP中存在着值传递和引用传递。后者需要使用地址符&来标识变量。使用赋值操作举例说明如下:
1、值传递
1)基本数据类型:
<?php
$a = 1;
$b = $a;
$b += 2;
echo "\$a = ".$a."<br />";
echo "\$b = ".$b."<br />";
/* 输出:
$a = 1
$b = 3
*/
?>
注:这里使用了$b = $a语句,是将$a的值赋给了$b。
即此时赋的值是1。
![](http://static.oschina.net/uploads/space/2012/0803/233401_c9zM_249989.png)
执行语句$b += 2后:
![](http://static.oschina.net/uploads/space/2012/0803/233454_pzHa_249989.png)
所以,$b变成了3,但是$a的值并没有改变。
2)引用数据类型
Person类如下:
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类对象,并设置属性:
$p1 = new Person();
$p1->setName("person1");
$p2 = new Person();
$p2->setName("person2");
执行以下操作:
$p3 = $p1;
测试:
echo "\$p1's ".$p1->toString().".<br />";
echo "\$p3's ".$p3->toString().".<br />";
/* 输出:
$p1's name is person1.
$p3's name is person1.
*/
注:
对于
$p3 = $p1语句,
即此时赋的值是0x000a。
即$p1和$p3都引用了同一个对象。
2、引用传递
1)基本数据类型
<?php
$a = 1;
$b = &$a;
$b += 2;
echo "\$a = ".$a."<br />";
echo "\$b = ".$b."<br />";
/* 输出:
$a = 3
$b = 3
*/
?>
注:这里使用$b = &$a语句,进行了引用传递:
即此时赋的值是0x0001。
![](http://static.oschina.net/uploads/space/2012/0803/235251_J9IO_249989.png)
所以对$b += 2后,
所以$a和$b的值都是3。
2)引用数据类型
若执行的是以下操作来替代之前的$p3 = $p1
$p3 = &$p1;
再执行以下操作:
$p3 = $p2;
测试结果如下:
echo "\$p1's ".$p1->toString().".<br />";
echo "\$p3's ".$p3->toString().".<br />";
/* 输出:
$p1's name is person2.
$p3's name is person2.
*/
注:对已打印出$p3的结果信息是很明了的,因为执行了$p3 = $p2语句,但是为什么打印$p1的结果信息与之前相比不一样了呢?
是因为$p3 = &$p1语句执行后, 即此时赋的值是0x0001。
紧接着执行$p3 = $p2语句后
所以才会打印出如上的结果信息,这便是地址符&在起作用。
完整代码如下:
1)引用数据类型
<?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;
}
}
$p1 = new Person();
$p1->setName("person1");
$p2 = new Person();
$p2->setName("person2");
$p3 = $p1;
// $p3 = &$p1;
// $p3 = $p2;
echo "\$p1's ".$p1->toString().".<br />";
echo "\$p3's ".$p3->toString().".<br />";
?>
2)基本数据类型
<?php
$a = 1;
$b = $a;
// $b = &$a;
$b += 2;
echo "\$a = ".$a."<br />";
echo "\$b = ".$b."<br />";
?>
结束语:对于值传递与引用传递在方法/函数参数的传递上情况下,与赋值操作情况是类似的。