函数 unset() 的行为如何根据访问函数内部全局变量的方式而有所不同?

How does the function unset() behaves differently depending on the way to access a global variable inside the function?

据我所知,在函数外声明的任何变量在 PHP.

中都被视为 'Global Variable'

要在函数内部访问这样的全局变量,有两种方法,一种是在函数内部使用关键字'global'声明为全局变量。另一种方法是将全局变量作为超全局变量的索引访问,如 $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

global keyword simply just import the variable into a function while $GLOBALS 是 PHP superglobal 数组。

An associative array containing references to all variables which are currently defined in the global scope of the script. The variable names are the keys of the array.

global 关键字视为同一变量的 clone/copy$GLOBALS 是全局变量所在的实际存储,您可以随时在存储中添加或删除.

因此,只要变量的 clone/copy 未设置,它就不会再存在于该范围内。 e.x

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

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

希望对您有所帮助。