Что делает этот цикл с использованием синтаксиса PHP $$? - PullRequest
2 голосов
/ 25 июня 2009

Я нашел этот код PHP в приложении, которое мне нужно изменить ...

$links = mysql_query($querystring);
foreach (mysql_fetch_array($links) as $key=>$value) 
{
    $$key = $value;
}

Я немного озадачен.

Действительно ли итерация результатов запроса и копирование значения в ключ?

Если так, какой смысл в этом?

Кроме того, что такое двойная нотация $$? Я не видел этого раньше в PHP, и я не могу найти ссылку на это на сайте PHP. Это опечатка? Кажется, не влияет на код. Я не хочу «чинить» что-то подобное без понимания последствий.

Ответы [ 4 ]

4 голосов
/ 25 июня 2009

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

$varname = 'foo';
$$varname = 'bar';

Вы только что установили $foo на 'bar'.

То, что делает цикл, это расширение содержимого строки в текущее пространство имен переменных, вроде extract () . Это ужасный способ сделать это, не в последнюю очередь потому, что он также перебирает числовые индексы.

2 голосов
/ 25 июня 2009

Вы обычно видите, что написано так.

$links = mysql_query($querystring);
while ($row = mysql_fetch_array($links)) 
{
    echo $row['id'];
}

$$ - это то, что называется переменная переменная .

Похоже, он по сути делает ключи как переменные, содержащие значение. Вроде того, что register_globals делает с переменными POST / GET и т. Д. Я бы не рекомендовал делать это так. Смею сказать, что это приведет к таким проблемам, как перезапись переменных и появление неожиданных переменных.

1 голос
/ 25 июня 2009

$$ будет ссылаться на переменную с именем, сохраненным в первой переменной. Так, например:

$var='some';
$some=15;
echo $$var;

Это выведет 15. Он берет $ vara и получает 'some', поэтому он принимает его как имя переменной из-за второго $ и печатает значение $ some, равное 15.

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

1 голос
/ 25 июня 2009

Создает пары ключ-значение на основе результатов SQL-запроса и структуры результатов.

Что касается $$, это просто еще одна переменная, за исключением того, что на этот раз это результат, который установлен в переменную.

$key = "hello";
$$key = "hi";
echo $key;

вывод: "привет"

...