Что делает этот цикл с использованием синтаксиса PHP $$?

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

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

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

Это действительно перебирает результаты запроса и копирует значение в ключ?

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам