php 变量的静态和全局修饰符实现了不可修改的引用吗?

x33g5p2x  于 2023-02-11  发布在  PHP
关注(0)|答案(1)|浏览(148)

来源
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的引用被无效了)?文档说实现导致了一个意外的行为。对此有逻辑上的解释吗?

dwthyt8l

dwthyt8l1#

这与全局或静态无关,这与引用的概念有关。
考虑以下代码:

$a = "a"; $b = "b";

$r = &$a;
var_dump($a, $b, $r); # a, b, a

$r = &$b;
var_dump($a, $b, $r); # a, b, b

这很容易理解,但重要的是语句$r = &$b;意味着将$b引用复制到$r,所以 * $b$r引用同一个值 *。
接下来如果您这样做:

$r = $a;
var_dump($a, $b, $r); # a, a, a

语句$r = $a;表示将$a复制到$r,因此$r的值从“B”变为“a”。由于 * $b$r都引用相同的值 *,因此$b的值也变为“a”。
最后,如果您这样做:

$r = "r";
var_dump($a, $b, $r); # a, r, r

仍然只有$b$r的值被改变,$a保持其原始值。
回到你的问题,你的第一个函数几乎等同于:

function test_global_ref(&$r) {
    $b = "b";
    $r = &$b;
}

$a = "a";
test_global_ref($a);

我把变量名和值改成了上面例子对应的变量名和值,希望这样更容易理解,所以全局变量$a作为引用$r传递给函数,当你把$b的引用复制到$r时,全局变量$a不会受到影响。

相关问题