Подтвердить что ты не робот

Как я могу эмулировать register_globals в PHP 5.4 или новее?

Я работаю над структурой, которая использует register_globals. Моя локальная версия php 5.4.

Я знаю, что register_globals устарела с PHP 5.3.0 и удалена в PHP 5.4, но я должен заставить этот код работать на PHP 5.4.

Есть ли способ эмулировать функциональность в новых версиях PHP?

4b9b3361

Ответ 1

Вы можете эмулировать 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

После этого код будет запускаться при каждом вызове, и приложение будет работать так, как если бы действовали старые настройки.

Ответ 2

На всякий случай это может быть полезно, это код, предложенный на 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

Ответ 3

Из руководства PHP говорится, что:

Эта функция была DEPRECATED с PHP 5.3.0 и удалена с PHP 5.4.0.

Однако поиск Google выявил этот метод на Ubuntu Forums:

Нет, наконец, он ушел навсегда. Какой бы сайт по-прежнему не использовал глобальные переменные было, что, полдюжины лет или больше, чтобы исправить код?

Самое быстрое решение - создать глобалы с нуля, запустив этот код в начале приложения:

Код:

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

Вы должны быть осторожны, чтобы любая переменная, созданная таким образом, еще не определена в оставшейся части script.

Вы можете заставить этот код запускать перед каждой страницей сайта используя директиву auto_prepend_file в файле .htaccess.

Я настоятельно рекомендую посмотреть код, который требует register_globals, и изменить его так, чтобы он работал правильно, когда он был отключен.

Ответ 4

В php.ini до:

auto_globals_jit = On

После:

auto_globals_jit = Off