函数unset()的行为如何不同,具体取决于访问函数内部全局变量的方式?

php output global-variables unset superglobals

45 观看

1回复

1316 作者的声誉

据我所知,在函数外声明的任何变量在PHP中都被视为“全局变量”。

要在函数内部访问此类全局变量,有两种方法之一是使用关键字“ global”将函数声明为全局变量。另一种方法是访问全局变量作为超全局变量as的索引$GLOBALS['global variable']

上面提到的两种方式都做同样的事情,并且都是有效的。

但是在接下来的两个程序中,由于两个程序都生成不同的输出,因此这种假设似乎失败了。我想清除这个疑问,这个假设是100%正确还是有时不起作用。

请仔细阅读以下代码段及其各自的结果:

代码段1:

<?php

  function destroy_foo() {
    global $foo;
    unset($foo);
  }

  $foo = 'bar';
  destroy_foo();
  echo $foo;
?>

代码段1的输出:

bar

代码段2:

<?php

  function destroy_foo() {
    unset($GLOBALS['foo']);
  }

  $foo = 'bar';
  destroy_foo();
  echo $foo;
?>

代码段2的输出:

注意:未定义的变量:第9行的hello.php中的foo

作者: PHPFan 的来源 发布者: 2017 年 9 月 15 日

回应 1


2

2514 作者的声誉

决定

全球关键字只是简单地导入所需的变量的函数,而$ GLOBALS是PHP superglobal数组。

包含对所有变量的引用的关联数组,这些变量当前在脚本的全局范围内定义。变量名是数组的键。

global关键字视为clone/copy同一个变量,而$GLOBALS全局变量则驻留在该实际存储中,您可以随时在该存储中添加或删除该变量。

因此,无论何时clone/copy未设置变量的a ,该范围内都将不存在该变量。前

<?php
function destroy_foo() 
{
    global $foo;
    unset($foo);
    echo $foo;-- Undefined variable: foo
}

$foo = 'bar';
destroy_foo();
?>

希望能帮助到你。

作者: Clean code 发布者: 2017 年 9 月 15 日
32x32