<p> PHP中存在着值传递和引用传递。后者需要使用地址符&来标识变量。使用赋值操作举例说明如下: </p> <p> 1、值传递 </p> <p> 1)基本数据类型: </p> <p> </p> <div> <div> <div> <table> <tbody> <tr> <td> 01 </td> <td> <?php </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 02 </td> <td> $a = 1; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 03 </td> <td> $b = $a; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 04 </td> <td> $b += 2; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 05 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 06 </td> <td> echo "\$a = ".$a."<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 07 </td> <td> echo "\$b = ".$b."<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 08 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 09 </td> <td> /* 输出: </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 10 </td> <td> $a = 1 </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 11 </td> <td> $b = 3 </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 12 </td> <td> */ </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 13 </td> <td> ?> </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> 注:这里使用了$b = $a语句,是将$a的值赋给了$b。 即此时赋的值是1。 <br /> <a href=/uploadfile/2016/0106/20160106051449149.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449149.png" /></a> <br /> 执行语句$b += 2后: <br /> <a href=/uploadfile/2016/0106/20160106051449859.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449859.png" /></a> </p> <br /> <p> 所以,$b变成了3,但是$a的值并没有改变。 </p> <p> 2)引用数据类型 </p> <p> Person类如下: </p> <div> <div> <div> <table> <tbody> <tr> <td> 01 </td> <td> class Person { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 02 </td> <td> private $_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 03 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 04 </td> <td> public function setName($name) { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 05 </td> <td> $this->_name = $name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 06 </td> <td> } </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 07 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 08 </td> <td> public function getName() { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 09 </td> <td> return $this->_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 10 </td> <td> } </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 11 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 12 </td> <td> public function toString() { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 13 </td> <td> return "name is ".$this->_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 14 </td> <td> } </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 15 </td> <td> } </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> 初始化两个Person类对象,并设置属性: </p> <p> </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> $p1 = new Person(); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 2 </td> <td> $p1->setName("person1"); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 3 </td> <td> $p2 = new Person(); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 4 </td> <td> $p2->setName("person2"); </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> 执行以下操作: </p> <p> </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> $p3 = $p1; </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> 测试: </p> <p> </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> echo "\$p1's ".$p1->toString().".<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 2 </td> <td> echo "\$p3's ".$p3->toString().".<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 3 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 4 </td> <td> /* 输出: </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 5 </td> <td> $p1's name is person1. </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 6 </td> <td> $p3's name is person1. </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 7 </td> <td> */ </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> 注: 对于 $p3 = $p1语句, 即此时赋的值是0x000a。 即$p1和$p3都引用了同一个对象。 </p> <br /> <p> <a href=/uploadfile/2016/0106/20160106051449630.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449630.png" /></a> </p> <p> 2、引用传递 </p> <p> 1)基本数据类型 </p> <p> </p> <div> <div> <div> <table> <tbody> <tr> <td> 01 </td> <td> <?php </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 02 </td> <td> $a = 1; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 03 </td> <td> $b = &$a; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 04 </td> <td> $b += 2; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 05 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 06 </td> <td> echo "\$a = ".$a."<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 07 </td> <td> echo "\$b = ".$b."<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 08 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 09 </td> <td> /* 输出: </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 10 </td> <td> $a = 3 </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 11 </td> <td> $b = 3 </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 12 </td> <td> */ </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 13 </td> <td> ?> </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> 注:这里使用$b = &$a语句,进行了引用传递: 即此时赋的值是0x0001。 <br /> <a href=/uploadfile/2016/0106/20160106051449324.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449324.png" /></a> </p> <br /> <p> </p> <p> </p> <p> </p> <p> 所以对$b += 2后, </p> <p> <a href=/uploadfile/2016/0106/20160106051449431.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449431.png" /></a> </p> <p> 所以$a和$b的值都是3。 </p> <p> 2)引用数据类型 </p> <p> 若执行的是以下操作来替代之前的$p3 = $p1 </p> <p> </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> $p3 = &$p1; </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> 再执行以下操作: </p> <p> </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> $p3 = $p2; </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> 测试结果如下: </p> <p> </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> echo "\$p1's ".$p1->toString().".<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 2 </td> <td> echo "\$p3's ".$p3->toString().".<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 3 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 4 </td> <td> /* 输出: </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 5 </td> <td> $p1's name is person2. </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 6 </td> <td> $p3's name is person2. </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 7 </td> <td> */ </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> 注:对已打印出$p3的结果信息是很明了的,因为执行了$p3 = $p2语句,但是为什么打印$p1的结果信息与之前相比不一样了呢? </p> <p> 是因为$p3 = &$p1语句执行后, 即此时赋的值是0x0001。 <br /> <a href=/uploadfile/2016/0106/20160106051449848.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449848.png" /></a> </p> <p> </p> <p> 紧接着执行$p3 = $p2语句后<br /> <a href=/uploadfile/2016/0106/20160106051449201.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449201.png" /></a> </p> <p> </p> <p> </p> <p> 所以才会打印出如上的结果信息,这便是地址符&在起作用。 </p> <p> 完整代码如下: </p> <p> 1)引用数据类型 </p> <p> </p> <div> <div> <div> <table> <tbody> <tr> <td> 01 </td> <td> <?php </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 02 </td> <td> class Person { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 03 </td> <td> private $_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 04 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 05 </td> <td> public function setName($name) { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 06 </td> <td> $this->_name = $name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 07 </td> <td> } </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 08 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 09 </td> <td> public function getName() { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 10 </td> <td> return $this->_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 11 </td> <td> } </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 12 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 13 </td> <td> public function toString() { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 14 </td> <td> return "name is ".$this->_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 15 </td> <td> } </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 16 </td> <td> } </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 17 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 18 </td> <td> $p1 = new Person(); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 19 </td> <td> $p1->setName("person1"); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 20 </td> <td> $p2 = new Person(); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 21 </td> <td> $p2->setName("person2"); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 22 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 23 </td> <td> $p3 = $p1; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 24 </td> <td> // $p3 = &$p1; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 25 </td> <td> // $p3 = $p2; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 26 </td> <td> echo "\$p1's ".$p1->toString().".<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 27 </td> <td> echo "\$p3's ".$p3->toString().".<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 28 </td> <td> ?> </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> 2)基本数据类型 </p> <p> </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> <?php </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 2 </td> <td> $a = 1; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 3 </td> <td> $b = $a; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 4 </td> <td> // $b = &$a; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 5 </td> <td> $b += 2; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 6 </td> <td> </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 7 </td> <td> echo "\$a = ".$a."<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 8 </td> <td> echo "\$b = ".$b."<br />"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 9 </td> <td> ?> </td> </tr> </tbody> </table> </div> </div> </div> <p> </p> <p> </p> <p> 结束语:对于值传递与引用传递在方法/函数参数的传递上情况下,与赋值操作情况是类似的。 </p> <!--内容关联投票-->