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 також є спеціальною змінною, на яку не можна посилатися динамічно.