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。
clip_image001
执行语句$b += 2后:
clip_image002

所以,$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都引用了同一个对象。

clip_image003

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。
clip_image004

所以对$b += 2后,

clip_image005

所以$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。
clip_image006

紧接着执行$p3 = $p2语句后
clip_image007

所以才会打印出如上的结果信息,这便是地址符&在起作用。

完整代码如下:

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

?>

结束语:对于值传递与引用传递在方法/函数参数的传递上情况下,与赋值操作情况是类似的。