Zmienne zmienne
W niektórych przypadkach jest wygodne, by móc użyć zmiennej o zmiennej
nazwie. To znaczy zmiennej, której nazwa może być zmieniana dynamicznie.
Zwykła zmienna jest ustawiana wyrażeniem jak poniżej:
Zmienna zmienna pobiera wartość jednej zmiennej i traktuje ją
jako nazwę innej. W powyższym przykładzie,
witaj, może stać się nazwą zmiennej,
dzięki użyciu dwóch znaków dolara, tzn.
W tym momencie dwie zmienne zostały zdefiniowane i umieszczone w drzewie
symbolicznym PHP: $a zawierająca "witaj" i
$witaj zawierająca "świecie". Zatem poniższy
zapis:
znaczy to samo, co:
tzn. obydwa wyświetlą: witaj świecie.
Aby używać zmiennych zmiennych jako tablic, trzeba
wyjaśnić pewną niejasność. Mianowicie, jeśli napiszesz
$$a[1], parser musi wiedzieć, czy
chesz użyć $a[1] jako nazwy zmiennej, czy
$$a jako nazwy tablicy, której rekord [1] cię
interesuje. W tym przypadku należy zastosować odrębną
składnię: ${$a[1]} dla pierwszego przypadku a
${$a}[1] dla drugiego.
Dostęp do właściwości klas można uzyskać także za pomocą zmiennej nazwy
własności. Zmienna nazwa własności zostanie zinterpretowana w
zasięgu z którego jest wywoływana. Przykładowo, jeżeli masz
wyrażenie takie jak $foo->$bar, to zasięg
lokalny będzie przeszukany pod kątem $bar i jej wartość
zostanie użyta jako nazwa własności
of $foo. Jest to także prawdą
jeżeli $bar jest dostępem do tablicy.
Uwaga
Dalsza dereferencja zmiennej nazwy własności, która jest tablicą różni się
semantyką w PHP 5 i PHP 7. Poradnik
Migracji do PHP 7.0
zawiera więcej szczegółów o rodzajach wyrażeń, które uległy zmianie i
tym jak używać nawiasów klamrowych, aby uniknąć niejednoznaczności.
Do jasnego ograniczenia nazwy własności można wykorzystać też nawiasy
klamrowe. Są one szczególnie użyteczne, gdy uzyskuje się dostęp do właściwości
zawierającej tablicę, gdy nazwa własności jest składana z wielu części
lub gdy nazwa własności zawiera znaki, które nie są
w innym wypadku prawidłowe (np. z json_decode()
lub SimpleXML).
Przykład #1 Przykład zmiennej własności
<?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";
?>
Powyższy przykład wyświetli:
I am bar.
I am bar.
I am bar.
I am r.
Ostrzeżenie
Zauważ, że zmienne zmienne nie mogą być używane z
Tablicami superglobalnymi
PHP, wewnątrz funkcji, czy metod klas. Zmienna $this
jest także specjalną zmienną, dla której referencje dynamiczne nie są dozwolone.