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

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

    <?php
    $a = 'hello';
    var_dump($a);

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

    <?php
    $a = 'hello';
    $$a = 'world';
    var_dump($hello);

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

    <?php
    $a = 'hello';
    $$a = 'world';
    echo "{$a} {$$a}";

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

    <?php
    $a = 'hello';
    $$a = 'world';
    echo "{$a} {$hello}";

Обе инструкции создадут строку: hello world.

Для работы с переменными переменных и массивами потребуется разрешить неоднозначность. Анализатору синтаксиса требуется знать, что имел в виду разработчик в записи $$a[1]: использовать $a[1] как переменную или $$a, а затем индекс [1] этой переменной. Синтаксис, который разрешит эту неоднозначность, выглядит вот так: ${$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 = ['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";
    echo $foo->{$arr}[1] . "\n";

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

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

Внимание

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

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open