избавиться от глобальных переменных

berkut

Новичок
избавиться от глобальных переменных

Как избавиться от всех глобальных переменных?
PHP:
$a = $GLOBALS;
for (reset($a); $key = key($a); next($a)) {
    echo $key."\r\n";
    if (!in_array($key, array('a', '_SERVER', '_GET', '_POST', '_COOKIE', '_FILES', '_ENV', '_REQUEST', '_SESSION', 'GLOBALS'))) {
        //unset ($GLOBALS[$key]);
    }
}
Этот код у меня выводит список примерно из 58 переменных.
Но если раскоментировать //unset ($GLOBALS[$key]);
то выводит список из 30 переменных!!?? Как-будто не
PHP:
$a = $GLOBALS;
а записано
PHP:
$a =& $GLOBALS;
Запутался совсем с этими глобалами
 

Фанат

oncle terrible
Команда форума
он хочет написать переносимый, настройконезависимый код
 

svetasmirnova

маленький монстрик
berkut
Сделай var_dump($GLOBALS) и всё сразу будет понятно.
Кстати, зачем ты это делаешь?
 

iNfantry

Новичок
можно каждую переменную, которая задействуется в твоем скрипте перед первым использованием обнулять ... Какое тебе дело до всех остальных? :)
 

berkut

Новичок
svetasmirnova делал я вардамп, но ничего понятнее не стало.
iNfantry можно, но не так удобно. + если чистить, можно у старого кода повысить секурность при минимуме действий.
Да и вообще, вопрос уже принципа, почему не работает, просто понять хочецца
 

iNfantry

Новичок
может неудобно, но 100% решение проблемы :)
прверил у себя, у меня вывело
HTTP_POST_VARS
_POST
HTTP_GET_VARS
_GET
HTTP_COOKIE_VARS
_COOKIE
HTTP_SERVER_VARS
_SERVER
HTTP_ENV_VARS
_ENV
HTTP_POST_FILES
_FILES
_REQUEST
GLOBALS
a
key
с закоментеной строкой
HTTP_POST_VARS
HTTP_GET_VARS
HTTP_COOKIE_VARS
HTTP_SERVER_VARS
HTTP_ENV_VARS
HTTP_POST_FILES
_REQUEST
GLOBALS
a
key
а это с раскоментеной
Пока не сильно напрягал голову, но может это связано с тем что например HTTP_GET_VARS и _GET - тоже самое?
 

iNfantry

Новичок
Избавляться от ГЛОБАЛЬНЫХ - чтобы исключить возможность передачи "нехороших" данных извне... Я думаю что для этого..
 

berkut

Новичок
Screjet, iNfantry - уловил смысл моей задумки.
Может это и Нехороший код, зато короче. + есть код написанный не тобой, что-же всё лопатить в ручную?

О богиня, светило PHP Club, озаряющее своей мудростью, о королева ооп, муза пхп, могу-ли я просить тебя, оставить все эти таинственные намёки на амперсанды и пролить свет истинны на моё голову. Я видел & перед елементом массива $GLOBALS
array(53) {
........
["GLOBALS"]=>
&array(53) {
......
}
}
(["GLOBALS"]=> &array(53)), но что это значит? То, что в массиве GLOBALS сть ссылка на самого себя? И что из этого?
 

svetasmirnova

маленький монстрик
то, что $a получает эту ссылку со всеми вытекающими. Там рекурсия ещё: запусти в cli, под Апачом менее подробный вывод почему-то.
Сейчас поясню на примере:
PHP:
$a = array();
$b =& $a;
$a[1] =& $b;
$c = $b;
// посмотрим что было сначала
var_dump($c);
unset($a[1]);
// и после unset
var_dump($c);
 

Andreika

"PHP for nubies" reader
berkut
будет достаточно интересно, если массив GLOBALS будет вместо ссылки на себя хранить себя целиком.

$a получается таки ссылкой..

то выводит список из 30 переменных!!??
а если добавить $key в список неудаляемых?
 

iNfantry

Новичок
В GLOBALS один из элементов - ссылка на сам же этот GLOBALS есть... Или я не про то вобще? Если непонятно про &, то про это почти во всех нормальных учебниках по пхп есть - это жесткие ссылки называется... :-*
 

berkut

Новичок
iNfantry про жёсткие ссылки я читал и вроде даже осознаю прочитанное.
$key я и правда забыл внести в список. Насколько я понял, GLOBALS всегда присваивается по ссылке? Я прав?
Над кодом svetasmirnova думаю, пытаюсь сделать логические выводы, но пока тчетно. Почему при переборе с unset() выпадают некоторые элементы массива?
Решение задачи нашёл, как всегда методом тыка, unset ($GLOBALS[$key]); заменить на $GLOBALS[$key] = null;
При этом, isset($var) будет возвращать false, а isset($GLOBALS['var']) === true
 

svetasmirnova

маленький монстрик
iNfantry, berkut
Объясните мне, пожалуйста, что такое жёсткие ссылки. В PHP.
 

iNfantry

Новичок
Сам давно их не использовал, если не ошибся в синтаксисе то вот пример
$a='123';
$b=&$a;
$b='456';
echo $a;//выведет 456, $b - второе имя для $a

-~{}~ 19.09.05 01:09:

тоесть $b - жесткая ссылка на $a

-~{}~ 19.09.05 01:19:

2berkut
Вовсе не оспариваю Ваших знаний... :) Получается что по ссылке присваивается...
 
Сверху