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

Иногда переменные имена переменных повышают удобство работы с кодом. Переменное имя переменной — имя переменной, которое устанавливается и изменяется динамически. Стандартную переменную устанавливают инструкцией вроде:

<?php

$a
= 'hello';

?>

Переменная переменной принимает значение переменной и обрабатывает значение переменной как имя переменной. Значение hello из приведённого примера становится — именем переменной через двойной знак доллара. То есть:

<?php

$$a = 'world';

?>

Теперь дерево символов PHP хранит два определения переменных: переменная $a, которая содержит значение «hello», и переменная $hello, которая содержит значение «world». Поэтому инструкция:

<?php

echo "$a {$$a}";

?>

...выведет то же, что и инструкция

<?php

echo "$a $hello";

?>

То есть обе инструкции выведут: hello world.

Программисты вынуждены устранять неоднозначность синтаксиса, чтобы использовать переменные переменных с массивами. Анализатору синтаксиса потребуется знать, в записи $$a[1] переменная это $a[1] или переменная это $$a, а [1] — индекс этой переменной. PHP предлагает такой синтаксис разрешения неоднозначности: ${$a[1]} для первого случая и ${$a}[1] для второго.

Доступ к свойствам класса также получают через переменные имена свойств. Переменное имя свойства разрешается внутри области видимости, в которой вызывают свойство класса. Например, для выражения $foo->$bar PHP проверит присутствие в локальной области видимости переменной $bar, значение которой возьмёт как имя свойства объекта $foo. Это справедливо и тогда, когда через переменную $bar обращаются к элементу массива.

Фигурные скобки также указывают, чтобы точно отделить имя свойства. Скобки наиболее полезны, когда получают доступ к значениям внутри свойства, которое содержит массив, когда имя свойства состоит из нескольких частей, либо когда имя свойства содержит символы, которые иначе не действительны (например, из функции json_decode() или из модуля SimpleXML).

Пример #1 Пример переменного имени свойства

<?php

class Foo
{
public
$bar = 'Я bar.';
public
$arr = array('Я A.', 'Я B.', 'Я C.');
public
$r = 'Я r.';
}

$foo = new Foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo
$foo->$bar . "\n";
echo
$foo->{$baz[1]} . "\n";

$start = 'b';
$end = 'ar';
echo
$foo->{$start . $end} . "\n";

$arr = 'arr';
echo
$foo->{$arr[1]} . "\n";

?>

Результат выполнения приведённого примера:


Я bar.
Я bar.
Я bar.
Я r.

Внимание

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