Использование $GLOBALS['HTTP_GET_VARS'] устарело?

Я знаю, что использование $HTTP_GET_VARS устарело, но как насчет использования $GLOBALS['HTTP_GET_VARS']? Может ли этот ключ массива исчезнуть в будущем?

В основном у меня есть следующее по всему устаревшему проекту, который мне нужно интегрировать с CMS, и я действительно не хочу обновлять его, если в этом нет крайней необходимости.

function table_manager_import_vars($var) {
   $vars = explode(",", $var);

   foreach($vars AS $var) {
       switch ($var) {
           case "G":
               $var = "HTTP_GET_VARS";
               break;
           case "P":
               $var = "HTTP_POST_VARS";
               break;
           case "C":
               $var = "HTTP_COOKIE_VARS";
               break;
           case "S":
               $var = "HTTP_SESSION_VARS";
               //session_start();
               break;
           case "E":
               $var = "HTTP_SERVER_VARS";
               break;
       }
       if (isset($GLOBALS[$var])) {
           if (is_array($GLOBALS[$var])) {
               foreach($GLOBALS[$var] AS $var1 => $value) {
                   if ($var1 != $var) {
                       $GLOBALS[$var1] = $value;
                   }
               }
           }
       }
   }
}
// called like this
table_manager_import_vars("G,P,C,S,E");

И да, как вы уже догадались, есть такая функция для каждого аспекта проекта, только каждый раз с другим именем!!


person Treffynnon    schedule 18.05.2011    source источник
comment
Как намекнул Игнасио, эта функция — ужасная идея.   -  person Lightness Races in Orbit    schedule 18.05.2011
comment
В любом случае они будут доступны только с register_long_arrays=On в php.ini.   -  person mario    schedule 18.05.2011


Ответы (3)


Ваш вопрос:

Использование $GLOBALS['HTTP_GET_VARS'] устарело?

Отвечать:

Да, это.

http://www.php.net/manual/en/reserved.variables.get.php

На этой странице прямо указано, что $HTTP_GET_VARS устарело, и вместо него следует использовать $_GET.

$HTTP_GET_VARS это то же самое, что и $GLOBALS['HTTP_GET_VARS']. И поэтому он также устарел по этой причине. (обратите внимание, что на все переменные, определенные в глобальной области видимости, можно ссылаться с помощью $GLOBALS['variablename'])

Между прочим: когда дело доходит до работы с унаследованным кодом, который использует $HTTP_GET_VARS, я знаю, вы сказали, что хотите избежать изменения кода, если можете этого избежать, но стоит отметить, что код этого века, вероятно, будет иметь большие проблемы, когда запускать в современной установке PHP, так как более старые версии PHP предполагали, что используются такие вещи, как magic_quotes. Если вы запустите тот же код в более новой версии PHP, у вас не будет magic_quotes, поэтому вы должны убедиться, что данные правильно экранированы.

Глядя на весь код, который у вас там есть, похоже, что он пытается скопировать все переменные в различных массивах HTTP_***_VARS в глобальную область видимости. Это функциональность, которая выполнялась автоматически в действительно старых версиях PHP, но была исключена из-за серьезных проблем с безопасностью. Я серьезно рекомендую отказаться от всего этого кода и преобразовать все, чтобы вместо этого использовать $_GET. Вы можете google for register_globals получить дополнительную информацию о том, почему это плохо.

person Spudley    schedule 18.05.2011
comment
Вы упустили момент, что ОП не знал, что $GLOBALS['HTTP_GET_VARS'] и $HTTP_GET_VARS - одно и то же. - person Lightness Races in Orbit; 18.05.2011
comment
@Tomalak - хех; да, добавлю. :-) - person Spudley; 18.05.2011
comment
Я согласен со всеми этими пунктами, но из-за распространения этого кода по всему легаси-проекту и старого врага бюджетов он вряд ли будет изменен. Этот код скрыт за парой уровней аутентификации в экстрасети, поэтому он вряд ли вызовет слишком много проблем с точки зрения безопасности. - person Treffynnon; 18.05.2011
comment
@Treffynnon - По сути, у вас здесь код PHP4, пытающийся эмулировать функцию PHP3. Внедрение этого в систему PHP5 вызовет у вас серьезную головную боль - в первую очередь будет сложно заставить ее работать, обслуживание будет абсолютной сукой (поверьте мне, я был там, когда дело доходит до к устаревшему коду PHP!), и независимо от любых других уровней безопасности, если этот код доступен в Интернете, у вас возникнут проблемы с безопасностью. - person Spudley; 18.05.2011

$HTTP_GET_VARS и $GLOBALS['HTTP_GET_VARS'] это одно и то же. $HTTP_GET_VARS является суперглобальным, а к суперглобальным объектам можно (но необязательно) обращаться через $GLOBALS.

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

person Ignacio Vazquez-Abrams    schedule 18.05.2011
comment
На самом деле $HTTP_GET_VARS не является суперглобальным. $_GET, который заменяет его, является суперглобальным. - person Spudley; 24.09.2011

Они такие же.

$HTTP_GET_VARS является $GLOBALS['HTTP_GET_VARS'], и поэтому "оба" устарели в пользу $_GET.

person Lightness Races in Orbit    schedule 18.05.2011