来源
PHP文档说
PHP根据引用实现了变量的静态和全局修饰符。
<?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);
?>
既然程序的第一个输出是NULL,这是不是说实现的引用是不可修改的(因此对&$new的引用被无效了)?文档说实现导致了一个意外的行为。对此有逻辑上的解释吗?
1条答案
按热度按时间dwthyt8l1#
这与全局或静态无关,这与引用的概念有关。
考虑以下代码:
这很容易理解,但重要的是语句
$r = &$b;
意味着将$b
的引用复制到$r
,所以 *$b
和$r
引用同一个值 *。接下来如果您这样做:
语句
$r = $a;
表示将$a
的值复制到$r
,因此$r
的值从“B”变为“a”。由于 *$b
和$r
都引用相同的值 *,因此$b
的值也变为“a”。最后,如果您这样做:
仍然只有
$b
到$r
的值被改变,$a
保持其原始值。回到你的问题,你的第一个函数几乎等同于:
我把变量名和值改成了上面例子对应的变量名和值,希望这样更容易理解,所以全局变量
$a
作为引用$r
传递给函数,当你把$b
的引用复制到$r
时,全局变量$a
不会受到影响。