Variable variables

Оновлено: 11.05.2023

Іноді зручно мати можливість мати змінні імена змінних. Тобто, ім'я змінної, яке можна задавати і використовувати динамічно. Звичайна змінна задається інструкцією типу:

<?php
$a = 'hello';
?>

Змінна змінна приймає значення змінної і розглядає його як ім'я змінної. У наведеному вище прикладі hello можна використовувати як ім'я змінної, використовуючи два знаки долара, тобто

<?php
$$a = 'world';
?>

На даний момент у дереві символів PHP визначено і збережено дві змінні: $a з вмістом "hello" і $hello з вмістом "world". Тому цей оператор:

<?php
echo "$a {$$a}";
?>

видає той самий результат, що і

<?php
echo "$a $hello";
?>

Тобто вони обидва продукують: "Привіт, світе".

Для того, щоб використовувати змінні змінні з масивами, ви повинні вирішити проблему неоднозначності. Тобто, якщо ви пишете $$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";

?>

Зверніть увагу, що змінні-змінні не можна використовувати з суперглобальними масивами PHP у функціях або методах класу. Змінна $this також є спеціальною змінною, на яку не можна посилатися динамічно.