Переменные переменных
Иногда переменные имена переменных повышают удобство работы с кодом.
Переменное имя переменной — имя переменной, которое устанавливается и изменяется
динамически. Стандартную переменную устанавливают вот такой инструкцией:
Переменная переменной принимает значение переменной и обрабатывает
значение как имя переменной. Значение hello из приведённого примера
станет именем переменной при обращении к переменной, которая хранит значение,
через двойной знак доллара.
То есть:
Теперь дерево символов PHP хранит два определения переменных:
переменная $a, которая содержит значение "hello",
и переменная $hello, которая содержит значение "world".
Поэтому инструкция:
...выведет то же, что и инструкция
Обе инструкции создадут строку: 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
— тоже специальная переменная,
на которую нельзя ссылаться динамически.