Переменные в переменных

uchenik

Новичок
Переменные в переменных

Почему данный код работает в сценарии
PHP:
$_GET = 12;
$a = "_GET";
echo $$a;	// выводит 12
но не работает в теле функции?
PHP:
function fns()
{
  $_GET = 12; 
  $a = "_GET";
  echo $$a;
}

fns();	// ничего не выводит
Если вместо суперглобальной $_GET использовать простую переменную - код работает и в теле

функции.
 

Фанат

oncle terrible
Команда форума
задай этот вопрос разработчикам

только не удивляйся ответу
 

kvf77

Red Devil
uchenik

зачем интересно ты вообще проделываешь подобный изврат?
 

uchenik

Новичок
kvf77, для такой функции
PHP:
function arg($key, $array)
{
  $a = $$array;
  return (empty($a[$key])) ? false : $a[$key];
}

$username = arg("username", "_COOKIE");
Чтобы без нотисов присваивать короткие имена переменным из массивов $_GET, $_POST, $_REQUEST, $_COOKIE
 

Фанат

oncle terrible
Команда форума
ААААААААААААААААА!!!
Рулез!!!

Чувак, ты гений!
 

uchenik

Новичок
Спасибо, теперь знаю что
"Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods."

А для моей функции есть более простое решение:
PHP:
function arg($key, $a)
{
  return (empty($a[$key])) ? false : $a[$key];
}
$username = arg("username", $_COOKIE);
Ну и приходит же в голову бред какой-то (переменные в переменных) ...
 

bgm

 
А почему просто не использовать такую конструкцию:

PHP:
$username = @$array['username'];
 

uchenik

Новичок
Ринат, если нет в массиве $_COOKIE елемента с таким ключем выскочит "Notice: Undefined index....."

-~{}~ 01.09.05 14:42:

bgm, прекрасно знаю что делает "@". Такой способ мне не подходит.
 

Ринат

Новичок
вопрос "чистоты" написание программы возможно...при любых вариантах можно вобще отключить всякий вывод...но это не выход
 

SiMM

Новичок
> и на твою функцию тоже
А вы хорошо подумали? [m]empty[/m]
PHP:
error_reporting(E_ALL);
ini_set('display_errors','On');
var_dump(empty($a['b']));
 

uchenik

Новичок
Ринат, конечно проще всего отключить вывод ошибок, но при отладке я поставлю error_reporting(E_ALL) и буду наблюдать кучу Notice. Лучше сразу писать правильно.

-~{}~ 01.09.05 15:49:

Еще лучше функцию сделать таким образом:
PHP:
function arg($key, $array = false)
{
  if(!$array) $array = $_REQUEST;
  return (empty($array[$key])) ? false : $array[$key];
}
Если данные находятся в массиве $_GET либо $_POST, то достаточно такого вызова:
PHP:
$username = arg('username');
 

Фанат

oncle terrible
Команда форума
во-первых, ещё и в куках.
во-вторых, ты наступаешь на старые грабли (когда одно и то же имя в куках и в посте и не надо рассказывать, что у тебя так не бывает. форум полон стонов с такими проблемами в сессиях)
в-третьих, вот что действительно было бы удобно - это подавать функции на вход массив с именами, а переменные она бы выплёвывала в глобальное пространство сама
 

uchenik

Новичок
Автор оригинала: Фанат
когда одно и то же имя в куках и в посте
Если этим переменным нужно присвоить короткие имена то проблем не вижу:
PHP:
$cookie_var = arg("var", $_COOKIE);
$post_var = arg("var");
Автор оригинала: Фанат
в-третьих, вот что действительно было бы удобно - это подавать функции на вход массив с именами, а переменные она бы выплёвывала в глобальное пространство сама
А вот это интересная идея. Нужно подумать.

-~{}~ 02.09.05 03:18:

для "массовой" инициализации переменных удобней будет такая функция:
PHP:
function args($vars, $array=false)
{
  if(!$array) $array = $_REQUEST;
  foreach($vars as $var)
  {
    global $$var;
    $$var = (empty($array[$var])) ? false : $array[$var];
  }
}

args(array("username", "password", "remember"));
После вызова args() получим три переменные, как и заказывал Фанат
 

MasterSID

Новичок
Автор оригинала: uchenik
Ринат, конечно проще всего отключить вывод ошибок, но при отладке я поставлю error_reporting(E_ALL) и буду наблюдать кучу Notice. Лучше сразу писать правильно.
А еще ко всему прочему @ замедляет выполнение скрипта. Проверял на скорость использование конструкций, которые порождают ноутисы и которые работают правильно. Так вот вторые на 50-70% быстрее в зависимости от ситуации, но в любом случае быстрее. Думаю, что это связано с регистрацией ошибок, т.к. @ всего-лишь предотвращает их вывод пользователю.
 
Сверху