PHP里的值传递与引用传递
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。
   
  
执行语句$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 | $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。
  
所以才会打印出如上的结果信息,这便是地址符&在起作用。
完整代码如下:
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 | ?> | 
结束语:对于值传递与引用传递在方法/函数参数的传递上情况下,与赋值操作情况是类似的。
 
                    
                



 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号