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

svetasmirnova

маленький монстрик
Сам давно их не использовал, если не ошибся в синтаксисе то вот пример
$a='123';
$b=&$a;
$b='456';
echo $a;//выведет 456, $b - второе имя для $a
Reference жёсткими ссылками называется? Не знала :confused: Кто это так переводит?
 

berkut

Новичок
Вообще ахтунг!
$a = $GLOBALS;
for (reset($a); $key = key($a); next($a)) {
echo $key."\r\n";
if (!in_array($key, array('a', 'key', '_SERVER', '_GET', '_POST', '_COOKIE', '_FILES', '_ENV', '_REQUEST', '_SESSION', 'GLOBALS'))) {
unset ($a[$key]);
}
}
Судя по всему, в $GLOBALS хранится ссылка на $GLOBALS, вот такой ужас непонятный. Но почему тогда var_dump($GLOBALS) первой строкой выдаёт array(58), а не &array(58)???
 

iNfantry

Новичок
2svetasmirnova
Это терминология *nix, есть еще и символические ссылки :) Аналогия с *nix тут очень близкая...
 

SiMM

Новичок
> Reference жёсткими ссылками называется? Не знала Кто это так переводит?
[m]language.references[/m]
Ссылки в PHP - аналог жёстких ссылок (hardlinks) в файловых системах Unix.
Видимо тут кто-то просто не понимает смысла слова "аналог".
 

texrdcom

Новичок
Как много шума человек хотел почитсить $GLOBALS
сделай так
PHP:
$GLOBALS=array();
Все теперь в нем элементов 0.
Но что бы ты понял если в системе ты не приминяеш вот таких иснструкции
PHP:
if($passwords===1)// $passwords - эту переменную берем с $GLOBALS - то тогда чистить данный масив $GLOBALS не особо надо! а если ты все таки хочешь использовать глобальные переменные для доступности их в различнных частях скрипта то просто чисти его как показанно выше
{
....
}
Но беречь так данные не очень правильно для хранения проще использовать обьекты, хотя иногда глабальные переменные тоже нормально и просто, все таки не зря их придумали!
 

berkut

Новичок
texrdcom круто. а ты уверен в своём коде? да и с рассуждениями я не согласен.
 

Фанат

oncle terrible
Команда форума
тем не менее, суперглобалы (по крайней мере - в пятёрке) остаются доступными при обнулении $GLOBALS
что кажется мне странным.
 

svetasmirnova

маленький монстрик
Фанат
там ссылки:
PHP:
$a = 5;
$b =& $a;
$c = array(1=> $b);
// обнуляем массив, который содержит ссылку на $a
$c = array();
var_dump($a);"
 

Фанат

oncle terrible
Команда форума
ссылки, не ссылки - но я полагал, что $GLOBALS содержит все переменные скрипта.
Я ошибался.
 

texrdcom

Новичок
что $GLOBALS содержит все переменные скрипта
А чего ты решил что ты ошибался ?
этот код работает точно
$test='test';
$GLOBALS=array();
print_r($GLOBALS);
Масив чистый и обратиться к $GLOBALS['test'] уже не льзя.
Но можно $test;
 

Фанат

oncle terrible
Команда форума
извини пожалуйста.
я не совсем допонял.
а какое отношение, в таком случае, предложенный тобой код имеет к вопросу автора этого топика?
 

texrdcom

Новичок
Емсори спешил :)
Отсюда выплывает вывод что если даже чистим globals
то переменных там нет которые были добавленны туда (значения ни имеет каким методом - ручным или автоматом)
Но эти переменные все равно остаються видны в самом скрипте тоесть у каждого скрипта есть свой внутриния $GLOBALS
И по идеии это правильно если вы создали эту переменную в скрипте значит она вам нужна, или она была созданна в связи с определенной настройкой php и такие переменные можно удалить только указав не посредственно unset($peremenay);
Или призначить для неё значения array();
--------
Globals -содержит только ссылки на переменные наверное сделали это не просто так (економия памяти)
 

berkut

Новичок
Но эти переменные все равно остаються видны в самом скрипте тоесть у каждого скрипта есть свой внутриния $GLOBALS
И по идеии это правильно если вы создали эту переменную в скрипте значит она вам нужна, или она была созданна в связи с определенной настройкой php и такие переменные можно удалить только указав не посредственно unset($peremenay);
texrdcom ты топик вообще не читаешь? Их можно удалить.
 

texrdcom

Новичок
Автору топика удалить глобальные переменные через удаления $GLOBALS не получиться ибо удаления ссылки не удаляет переменую, но ты можеш полностью обнулить их значения пройдясь по масиву $GLOBALS
PHP:
$test='Проба';
function delvalue(&$value)
{
$value=array();
}
array_map("delvalue", $GLOBALS);
echo $test;// Выводит array()
print_r($GLOBALS);// Выводит array()
-~{}~ 19.09.05 17:54:

texrdcom ты топик вообще не читаешь? Их можно удалить.
Да читаю но быстро заодно пишу что то, и стараюсь ответить правильно но так как иногда пишут вникнуть без бутилки тяжело-
Зачем пишу вообще ответы -? интерестно самому разбирать кикието проблемы :) - не стандартные!
 

RushHourRider

Новичок
Че вы паритесь? Надо сделать "чистый" запуск?

PHP:
$_preservatives = array('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','HTTP_SESSION_VARS','_SESSION','GLOBALS');
$_spermatozoids = array_keys($GLOBALS);
$_contraceptive = array_merge(array('_contraceptive', '_spermatozoids'), array_diff($_spermatozoids, $_preservatives));
foreach ($_contraceptive as $piece) {
    $GLOBALS[$piece] = null;
    unset($GLOBALS[$piece]);
}
// тут уже чисто
// print_r(array_keys($GLOBALS));
// var_dump(isset($_preservatives));
Интересно просто стало... Только вот я голову ломаю - на кой хенг это нужно? :-/
Предохранение - это гуд, но не до такой же степени. Без багов жизнь была бы скучна, однака.
 

berkut

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

svetasmirnova

маленький монстрик
>О богиня, светило PHP Club, озаряющее своей мудростью, о королева ооп, муза пхп

К сожалению я не принцесса sources при этом :)
Думаю вот почему. Вспомним про аналогию с жёсткой ссылкой и посмотрим на пример с конца:
$c = $b;
вот в этой строчке в $c копируется $b, т.е. она эквивалентна
$c =& array([1] => &$b);
соответственно эквивалентна
$c =& array([1] => &array(*RECURSION*));
соответственно эквивалентна
$c =& array([1] => &$a);

Если сделать var_dump($a) в конце исходного примера, получим пустой массив. Что и требовалось доказать.

Note: $c =& array синтаксически неверно, но смысл отражает.
 
Сверху