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
相关产品推荐
相关产品推荐

