Неожиданное поведение с переменными переменными - PullRequest
3 голосов
/ 08 марта 2012

Я пытался передать переменную, которая содержала имя суперглобального массива. Я хотел, чтобы функция обрабатывала, но я не мог заставить его работать, он просто утверждал, что рассматриваемая переменная не существует, и возвращал ноль,

Я упростил мой тестовый пример до следующего кода:

function accessSession ($sessName)
{
    var_dump ($$sessName);
}

$sessName   = '_SERVER';

var_dump ($$sessName);

accessSession ($sessName);

Var_dump вне функции возвращает содержимое $ _SERVER, как и ожидалось.Однако var_dump в функции вызывает ошибку, упомянутую выше.

Добавление global $_SERVER к функции не привело к исчезновению ошибки, но присвоение $ _SERVER другой переменной и выполнение этой глобальной переменной (см. Ниже)

function accessSession ($sessName)
{
    global $test;
    var_dump ($$sessName);
}

$test       = $_SERVER;
$sessName   = 'test';

var_dump ($$sessName);

accessSession ($sessName);

это ошибка PHP, или я просто делаю что-то не так?

Ответы [ 4 ]

3 голосов
/ 08 марта 2012

PHP: переменные переменные - вручную

Внимание

Обратите внимание, что переменные нельзя использовать с PHP Суперглобальные массивы внутри функций или методов класса . Переменная $ this также является специальной переменной, на которую нельзя ссылаться динамически.


Решения

function access_global_v1 ($var) {
  global    $$var;
  var_dump ($$var);
}

function access_global_v2 ($var) {
  var_dump ($GLOBALS[$var]);
}

$test = 123;

access_global_v1 ('_SERVER');
access_global_v2 ('test');
2 голосов
/ 08 марта 2012

С php.net :

Предупреждение

Обратите внимание, что переменные нельзя использовать с суперглобальными массивами PHP внутри функцийили методы класса.Переменная $ this также является специальной переменной, на которую нельзя ссылаться динамически.

0 голосов
/ 08 марта 2012

Используйте $ GLOBALS. Вот и все:)

<?php

function accessSession ($sessName)
{
    var_dump ($GLOBALS[$sessName]);
}

$sessName   = '_SERVER';

accessSession ($sessName);
0 голосов
/ 08 марта 2012

Ответ довольно прост: никогда не используйте переменные переменные .
Вместо этого используйте массивы .

(и да - вы делаете что-то не так. Нет, это не ошибка в PHP.)

...