PHP中引用运算符&的用法与原理详解

追风的人
追风的人
发布时间:2026-10-13| 4人浏览过
原创

在 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 引擎管理的复杂机制。其核心原则是“写时拷贝”。

  1. 读取阶段:当 $b = $a; 时,两者指向同一块内存地址,互不占用额外空间。
  2. 写入阶段:一旦试图修改其中一个变量(如 $a = "EFG";),Zend 引擎会自动检测,并为修改方($a)复制一份新的内存空间,使其拥有独立的存储。此时 $b 保持不变。

这种机制在保证引用高效性的同时,避免了不必要的内存复制开销。

以上就是PHP中引用符号&用法的详细内容,更多关于PHP引用机制与优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。