Php $GLOBALS=array();?

Php $GLOBALS=array();?,php,Php,简单地将$GLOBALS设置为空数组有什么问题吗?我想逆转register_globals的效果,在该功能打开时,用户无法访问.ini文件,而不是像通常那样迭代每个相关的超级全局变量并在必要时取消设置,跳过$globals[''u POST'],$globals['u GET']等元素,我不知道把它们全部去掉是否可以 这是否会产生任何问题?我从未计划引用$GLOBALS数组,因为任何与作用域无关的变量要么在相关的超全局($\u GET,$\u POST等)中设置,要么作为相关注册表类的属性存储

简单地将
$GLOBALS
设置为空数组有什么问题吗?我想逆转
register_globals
的效果,在该功能打开时,用户无法访问
.ini
文件,而不是像通常那样迭代每个相关的超级全局变量并在必要时取消设置,跳过
$globals[''u POST']
$globals['u GET']
等元素,我不知道把它们全部去掉是否可以

这是否会产生任何问题?我从未计划引用
$GLOBALS
数组,因为任何与作用域无关的变量要么在相关的超全局(
$\u GET
$\u POST
等)中设置,要么作为相关注册表类的属性存储

有关信息,位于的常见问题解答有以下内容可供模拟
register\u globals=0

<?php
// Emulate register_globals off
function unregister_GLOBALS()
{
    if (!ini_get('register_globals')) {
        return;
    }

    // Might want to change this perhaps to a nicer error
    if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
        die('GLOBALS overwrite attempt detected');
    }

    // Variables that shouldn't be unset
    $noUnset = array('GLOBALS',  '_GET',
                     '_POST',    '_COOKIE',
                     '_REQUEST', '_SERVER',
                     '_ENV',     '_FILES');

    $input = array_merge($_GET,    $_POST,
                         $_COOKIE, $_SERVER,
                         $_ENV,    $_FILES,
                         isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());

    foreach ($input as $k => $v) {
        if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {
            unset($GLOBALS[$k]);
        }
    }
}

unregister_GLOBALS();

?>
PHP说

如果“references”一词是以典型的PHP方式使用的,那么设置
$GLOBALS=array()
对您没有帮助,您需要:

foreach ($GLOBALS as $k=>$v) unset($$k);
编辑:这可以扩展到

foreach ($GLOBALS as $k=>$v) 
  if (substr($k,0,1)!='_')
    unset($$k);
只是为了安全!(没有尝试)

编辑2:

根据Karoly的评论,如果在类或函数中执行此操作,则需要

foreach ($GLOBALS as $k=>$v) {
  global $$k;
  unset($$k);
}
编辑3编辑错误

。。因为它包含了肥胖的手指-意外的结果来自打字错误

我自己已经回答了部分问题。我很愚蠢,没有早点尝试:

$var = 'Hello, world!';

unset($GLOBALS['var']);

echo $var; // Notice: Undefined variable: var



$var = 'Hello, world!';

$GLOBALS = array();

echo $var; // Hello, world!
因此,简单地将
$GLOBALS
设置为空数组不会取消设置全局变量。它们需要明确地取消设置

更新:


使用
unset($GLOBALS[''u GET'])
与使用
unset($\u GET)
相同,这绝对不是我想要的。问题得到了回答

它在k点是递归的
$GLOBALS['GLOBALS']
@KarolyHorvath捕捉得好!修正了我的答案。这似乎与注册全局的常见问题相冲突:-参见第二个例子。“模拟寄存器_全局关闭”,所需的只是
unset($globals[$k])@MichaelRushton所以“references”这个词在PHP中不常用,谢谢你指出这一点——但是看看我的更新答案@EugenRieck,我相信这是因为您手动设置了
$b
。这适用于启用
register\u globals
时,可以使用
$b
$\u get['b']
获取值。啊,在您的示例中,您有
未设置($GLOBAL['b'])而不是
unset($GLOBALS['b'])
$var = 'Hello, world!';

unset($GLOBALS['var']);

echo $var; // Notice: Undefined variable: var



$var = 'Hello, world!';

$GLOBALS = array();

echo $var; // Hello, world!