如何在PHP 5.4或更高版本中模拟register_globals?

时间:2013-05-23 05:15:25

标签: php register-globals

我正在开发一个使用register_globals的框架。我的本地php版本是5.4。

我知道自PHP 5.3.0以来已弃用register_globals并在PHP 5.4中删除,但我必须使此代码在PHP 5.4上运行。

有没有办法在较新版本的PHP上模拟功能?

4 个答案:

答案 0 :(得分:25)

您可以在全局extract中使用scope模仿register_globals

extract($_REQUEST);

或者使用全局和variable variables

将其置于独立功能
function globaling()
{
    foreach ($_REQUEST as $key => $val)
    {
        global ${$key};
        ${$key} = $val;
    }
}

如果您有已发布的应用程序并且不想更改其中的任何内容,则可以使用

创建globals.php文件
<?php
extract($_REQUEST);

然后将auto_prepend_file指令添加到.htaccess(或在php.ini中)

php_value auto_prepend_file ./globals.php

在此之后,代码将在每次调用时运行,应用程序将像旧设置生效一样工作。

答案 1 :(得分:7)

以防它可能有用,这是在php.net上建议的代码,以模拟 register_globals On

<?php
// Emulate register_globals on
if (!ini_get('register_globals')) {
    $superglobals = array($_SERVER, $_ENV,
        $_FILES, $_COOKIE, $_POST, $_GET);
    if (isset($_SESSION)) {
        array_unshift($superglobals, $_SESSION);
    }
    foreach ($superglobals as $superglobal) {
        extract($superglobal, EXTR_SKIP);
    }
}

来源:http://php.net/manual/en/faq.misc.php#faq.misc.registerglobals

答案 2 :(得分:5)

来自PHP manual,它说:

  

自PHP 5.3.0开始,此功能已被弃用,自PHP 5.4.0起已被删除。

但是,Google搜索在Ubuntu Forums上显示了此方法:

  

不,它终于好转了。无论哪个站点仍在使用全局变量   有什么,现在,半年或更长时间来修复代码?

     

最快的解决方案是通过运行从头开始创建全局变量   这个代码在应用程序的开头:

     

代码:

foreach ($_REQUEST as $key=>$val) {
    ${$key}=$val;
}
  

您必须要小心,在此脚本的其余部分中尚未定义以这种方式创建的任何变量。

     

您可以强制此代码在网站上的每个页面之前运行   在.htaccess文件中使用auto_prepend_file指令。

我强烈建议您查看需要register_globals的代码并进行更改,以便在禁用时正常运行。

答案 3 :(得分:0)

在php.ini之前:

auto_globals_jit = On

后:

auto_globals_jit = Off