PHP中引用运算符&的用法与原理详解
在 PHP 开发中,引用(Reference)允许不同的变量名访问同一个内容,从而节省内存空间并实现特定的参数传递效果。本文将深入解析引用符号 & 的具体用法,包括变量引用、函数传址、对象实例化以及底层的“写时拷贝”机制。
1. 变量的引用
在 PHP 中,使用 & 符号可以将一个变量绑定到另一个变量上。这意味着两个变量不再各自拥有独立的内容存储,而是指向相同的内存地址。
基本操作:
- 目的:建立两个变量到同一内容的连接。
- 操作:使用赋值运算符
=结合&。 - 代码:
<?php
$a = "ABC";
$b = &$a;
echo $a; // 输出: ABC
echo $b; // 输出: ABC
$b = "EFG";
echo $a; // 输出: EFG,因为 $a 和 $b 共享同一地址
echo $b; // 输出: EFG
?>
重要提示:如果取消对某个变量的引用(例如使用 unset()),仅仅是切断了该变量名与该内存地址的绑定关系,而被引用的变量内容和内存并不会被销毁。
2. 函数的引用
函数中的引用主要用于修改外部变量的值,或者从函数内部获取动态变化的引用状态。
第1步:函数的传址调用(按引用传递)
- 目的:在函数内部修改变量,使得调用者也能看到修改后的结果。
- 入口:函数声明处参数前加
&。 - 动作:将实参的内存地址传递给形参。
- 注意:不能传递常量(如
test(1)会报错),只能传递变量。
<?php
function test(&$a) {
$a = $a + 100;
}
$b = 1;
echo $b . "<br>"; // 输出 1
test($b); // 传入 $b 的地址
echo $b; // 输出 101,$b 的值已被改变
?>
第2步:函数的引用返回
- 目的:让函数返回值可以像普通变量一样被修改,且影响函数内部的静态或全局状态。
- 操作:函数声明和调用两端均需加
&。 - 关键点:如果使用
$a = test();方式调用,即使函数使用了return &$b;,也只会得到值的拷贝;只有使用$a = &test();才能真正建立引用绑定。
<?php
function &test(){
static $b=0;//申明一个静态变量
$b=$b+1;
echo $b;
return $b;
}
// 第一种情况:不直接绑定引用
$a = test(); // 第一次调用,输出 1
$a = 5; $a = test(); // 第二次调用,输出 2,此时 $a 只是数值 2
// 第二种情况:正确绑定引用
$a = &test(); // 第三次调用,输出 3
$a = 5; // 尝试修改 $a
$a = test(); // 第四次调用,由于 $a 仍指向静态变量 $b,此处逻辑依赖执行顺序展示引用特性
?>- 结论:
$a = &test();会让$a直接指向函数内部的返回变量内存地址。此后修改$a会直接影响函数内部的状态。
3. 对象的引用与克隆
在 PHP 5 及更高版本中,对象的实例化默认就是通过引用来实现的。
<?php
class a{
var $abc = "ABC";
}
$b = new a;
$c = $b; // $c 与 $b 引用同一个对象实例
echo $b->abc; // 输出: ABC
echo $c->abc; // 输出: ABC
$b->abc = "DEF"; // 修改 $b 的属性
echo $c->abc; // 输出: DEF,$c 也随之改变
?>
如果你需要创建一个对象的副本,且希望修改副本不影响原对象,必须使用 __clone() 魔术方法:
<?php
$d = clone $b; // 创建 $b 的一个副本
d->abc = "GHI";
echo $b->abc; // 仍然是 DEF,与原对象分离
?>
4. 其他引用场景与底层原理
全局引用 ($GLOBALS)
在函数内部使用 global $var; 实际上是建立了一个对该全局变量的引用。这与 $var =& $GLOBALS['var']; 效果相同。在此情况下,对函数内的 $var 进行 unset() 不会删除全局变量本身,仅断开了局部函数名的绑定。
$this 的特性
在类的方法中,$this 永远是对当前调用对象的引用。
5. 内存原理:“写时拷贝” (Copy-on-Write)
PHP 引用并非由用户完全控制的指针,而是由 Zend 引擎管理的复杂机制。其核心原则是“写时拷贝”。
- 读取阶段:当
$b = $a;时,两者指向同一块内存地址,互不占用额外空间。 - 写入阶段:一旦试图修改其中一个变量(如
$a = "EFG";),Zend 引擎会自动检测,并为修改方($a)复制一份新的内存空间,使其拥有独立的存储。此时$b保持不变。
这种机制在保证引用高效性的同时,避免了不必要的内存复制开销。
以上就是PHP中引用符号&用法的详细内容,更多关于PHP引用机制与优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













