15

我正在研究一个使用register_globals. 我的本地 php 版本是 5.4。

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

有什么方法可以模拟较新版本的 PHP 的功能?

4

4 回答 4

30

您可以在全局范围内register_globals使用extract进行模拟:

extract($_REQUEST);

或者使用全局变量和变量变量将其置于独立函数中

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

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

于 2013-05-23T05:29:18.840 回答
11

以防万一它可能会有所帮助,这是 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

于 2014-10-30T15:30:03.737 回答
5

PHP 手册中,它说:

此功能自 PHP 5.3.0 起已弃用,自 PHP 5.4.0 起已移除。

然而,谷歌搜索在Ubuntu 论坛上发现了这种方法:

不,它终于永远消失了。无论哪个站点仍在使用全局变量,现在已经有六六年或更长时间来修复代码了?

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

代码:

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

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

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

我强烈建议查看需要的代码register_globals并对其进行更改,以便在禁用它的情况下正常工作。

于 2013-05-23T05:20:01.370 回答
0

在 php.ini 之前:

auto_globals_jit = On

后:

auto_globals_jit = Off
于 2016-07-01T11:08:17.330 回答