首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$GLOBALS = array();?

$GLOBALS = array();?
EN

Stack Overflow用户
提问于 2012-05-14 10:21:01
回答 1查看 1.6K关注 0票数 1

简单地将$GLOBALS设置为空数组有什么问题吗?我想扭转register_globals的影响,因为它是打开的,而且一个人不能访问.ini文件,而不是在必要时迭代每个相关的超级全局和未设置的元素,跳过$GLOBALS['_POST']$GLOBALS['_GET']等元素,就像通常所做的那样,我想知道只删除它们是否可以。

这是否会产生任何问题?我从来没有计划将$GLOBALS数组作为任何独立于作用域的变量来引用,或者在相关的超级全局($_GET$_POST等)中设置。或将作为相关注册表类的属性存储。

关于信息,http://www.php.net/manual/en/faq.misc.php#faq.misc.registerglobals的FAQ有以下几个来模拟register_globals = 0

代码语言:javascript
复制
<?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();

?>

据推测,执行unset($GLOBALS[$k]);与执行$GLOBALS = array();一样,只是后者删除了所有内容,只涉及一行代码。

那么问题是:取消$GLOBALS['_GET']$GLOBALS['_PUT']等(“不应该取消设置的变量”,如示例所述-真的是这样吗?)

更新:

我已经在下面回答了这个问题。愚蠢的我没有早点尝试。

EN

回答 1

Stack Overflow用户

发布于 2012-05-14 10:25:09

PHP 手册

代码语言:javascript
复制
$GLOBALS — References all variables available in global scope

如果以典型的PHP方式使用“参考”一词,设置$GLOBALS=array()不会对您有所帮助,您需要:

代码语言:javascript
复制
foreach ($GLOBALS as $k=>$v) unset($$k);

编辑:可以扩展到

代码语言:javascript
复制
foreach ($GLOBALS as $k=>$v) 
  if (substr($k,0,1)!='_')
    unset($$k);

只是为了安全!(没有尝试)

编辑2:

从Karoly的评论来看,如果您在类或函数中这样做,您需要

代码语言:javascript
复制
foreach ($GLOBALS as $k=>$v) {
  global $$k;
  unset($$k);
}

编辑3是令人敬畏的

。。因为它有肥硕的手指

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10581467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档