Переменные переменных
Иногда бывает удобно иметь переменными имена переменных. То есть,
имя переменной, которое может быть определено и изменено
динамически. Обычная переменная определяется примерно таким
выражением:
Переменная переменной берет значение переменной и рассматривает
его как имя переменной. В вышеприведённом примере
hello может быть использовано как имя
переменной при помощи двух знаков доллара. То есть:
Теперь в дереве символов PHP определены и содержатся две
переменные: $a, содержащая "hello" и
$hello, содержащая "world". Таким образом,
выражение
выведет то же, что и
то есть, они оба выведут: hello world.
Для того чтобы использовать переменные переменных с массивами, вы должны решить
проблему двусмысленности. То есть, если вы напишете $$a[1],
обработчику необходимо знать, хотите ли вы использовать $a[1] в
качестве переменной, либо вам нужна как переменная $$a, а затем
её индекс [1]. Синтаксис для разрешения этой двусмысленности таков: ${$a[1]}
для первого случая и ${$a}[1] для второго.
К свойствам класса также можно получить доступ динамически. Переменное имя свойства
будет разрешено в том контексте, в котором произойдёт вызов к нему. Например, в случае
выражения $foo->$bar, локальная область видимости будет
просканирована на наличие переменной $bar, значение которой
будет использовано в качестве имени свойства объекта $foo.
Это также работает и в том случае, если $bar осуществляет доступ
к элементу массива.
Фигурные скобки могут также использоваться, чтобы чётко разграничить имя
свойства. Они наиболее полезны при получении доступа к значениям внутри свойства,
которое содержит массив, когда имя свойства состоит из нескольких частей,
либо когда имя свойства содержит символы, которые иначе не
действительны (например, из функции json_decode()
или из SimpleXML).
Пример #1 Пример переменного имени свойства
<?php
class foo {
var $bar = 'I am bar.';
var $arr = array('I am A.', 'I am B.', 'I am C.');
var $r = 'I am 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";
?>
Результат выполнения приведённого примера:
I am bar.
I am bar.
I am bar.
I am r.
Внимание
Обратите внимание, что переменные переменных не могут
использоваться с
суперглобальными массивами
PHP. Переменная $this
также является особой, на неё
нельзя ссылаться динамически.