PHP里的值传递与引用传递

2020-08-04T11:42:54
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

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类如下:

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。 

所以对$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 />";
?>

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

扫一扫关注公众号添加购物返利助手,领红包
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »
因本文不是用Markdown格式的编辑器书写的,转换的页面可能不符合MIP标准。