php中的全局引用

时间:2014-07-01 23:23:26

标签: php variables reference global

我在php.net上阅读这篇文章:

"当您将变量声明为global $var时,您实际上正在创建对全局变量的引用。这意味着,这与:

相同
<?php
$var =& $GLOBALS["var"];
?>

这也意味着取消设置$var不会取消设置全局变量。&#34;

我从中理解的是,当您将变量声明为global $var时,您为变量名称$ GLOBALS [&#34; var&#34;]设置了另一个名称。所以如果你回应一个或那个,你会得到同样的东西。但我发现最后一句话令人困惑,因为以下代码段输出&#39; red&#39;:

$GLOBALS['var']='blue';
global $var;  //This is supposed to be equivalent to $var=& $GLOBALS["var"];
//echo $var,'<br/>';
$var='red';
echo $GLOBALS['var']; //I would expect this to output 'blue', instead of 'red'

我期待输出为蓝色&#39;因为它声明取消设置$var不会取消设置全局变量。错误在哪里?

如果我unset($var),我应该如何检查全局变量是否未设置?

2 个答案:

答案 0 :(得分:2)

$var='red';

它不是不安定的,它的分配。 Assigment会影响全局变量。

  

这也意味着取消设置$ var不会取消设置全局变量。

关于使用unset功能。 unset($var)从当前范围中删除变量,但全局变量仍然存在。

答案 1 :(得分:1)

您需要了解您错过了那个小细节&。这样做,是说你想要original reference而不是变量的副本。

function test() {
    $var = $GLOBALS['x'];
    $var2 = &$GLOBALS['x'];
    echo $GLOBALS['x'] . "\n";
    $var2 = 'red';
    echo $var . "\n" . $GLOBALS['x'];

}

$x = 'blue';
test();

此输出

blue
red

您会注意到$var已分配给全局版本,但发生的事情只是PHP 复制 $x。使用$var2,我们告诉PHP我们想要引用,换句话说,我想要$x的实际地址。这会产生巨大的差异,因为$var只是一个副本。更改它只会更改副本。请注意,在我的示例中,我更改了$x的值,但只有$var2反映了该更改。 $var仍然具有$x开头的内容。