You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中static与global变量修饰符是否实现不可修改引用?

PHP中global修饰符的引用实现与意外行为解析

文档说明

PHP 以引用的方式实现变量的 static 和 global 修饰符。

测试代码

<?php
function test_global_ref() {
    global $obj;
    $new = new stdClass;
    $obj = &$new;
}

function test_global_noref() {
    global $obj;
    $new = new stdClass;
    $obj = $new;
}

test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>

问题与解析

运行上述代码后第一次var_dump($obj)输出NULL,核心原因在于global修饰符的引用实现逻辑:

  • global $obj的本质是在函数内部创建一个指向全局变量$GLOBALS['obj']的引用变量,等价于执行$obj =& $GLOBALS['obj'];。
  • 在test_global_ref()中,$obj = &$new这一步是修改了函数内$obj这个引用变量本身的指向,让它转而指向$new,而非通过引用修改全局变量$GLOBALS['obj']的值。当函数执行完毕,局部的$obj和$new被销毁,全局的$GLOBALS['obj']从未被赋值,因此第一次输出NULL。
  • 在test_global_noref()中,$obj = $new是通过引用对全局变量$GLOBALS['obj']进行赋值,把它指向了新创建的对象,所以第二次var_dump会输出该对象的信息。

这种行为就是文档提到的"意外行为"——开发者容易混淆"修改引用变量的指向"和"通过引用修改原变量的值",误以为$obj =& $new会改变全局变量,实则只是断开了局部引用与全局变量的关联。

内容的提问来源于stack exchange,提问作者brittle_spirit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:35:30