Variabla variabler

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Variabla variabler


Ibland kan det vara praktiskt att kunna ha variabla variabelnamn. Det vill säga, ett variabelnamn som kan ställas in och användas dynamiskt. En vanlig variabel ställs in med ett uttryck som:

<?php
$a = 'hello';

?>

En variabel variabel tar värdet av en variabel och behandlar det som namnet på en variabel. I exemplet ovan kan hello användas som namnet på en variabel genom att använda två dollartecken. Till exempel:

<?php
$$a = 'world';

?>
Vid denna tidpunkt har två variabler definierats och lagrats i PHP:s symbolträd: $a med innehållet "hello" och $hello med innehållet "world". Därför kommer detta uttryck:
<?php
echo "$a {$$a}";
?>
att producera exakt samma utdata som:
<?php
echo "$a $hello";
?>
dvs. de producerar båda: hello world.

Variabla variabler med arrayer


För att använda variabla variabler med arrayer måste man lösa ett tvetydighetsproblem. Det vill säga, om du skriver $$a[1] så måste tolken veta om du menade att använda $a[1] som en variabel, eller om du ville ha $$a som variabeln och sedan index [1] från den variabeln. Syntaxen för att lösa denna tvetydighet är: ${$a[1]} för det första fallet och ${$a}[1] för det andra.

=== Tillgång till klass egenskaper med variabla variabelnamn ===
Klassegenskaper kan också nås med variabla egenskapsnamn. Det variabla egenskapsnamnet kommer att lösas inom den omfattning från vilken anropet görs. Till exempel, om du har ett uttryck som $foo->$bar, kommer den lokala omfattningen att undersökas för $bar och dess värde kommer att användas som namnet på egenskapen hos $foo. Detta gäller även om $bar är en åtkomst till en array.

Krullparenteser kan också användas för att tydligt avgränsa egenskapsnamnet. De är mest användbara när man når värden inom en egenskap som innehåller en array, när egenskapsnamnet består av flera delar eller när egenskapsnamnet innehåller tecken som annars inte är giltiga (t.ex. från json_decode() eller SimpleXML).

Exempel #1 Variabel egenskap exempel
<?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";

?>


Ovanstående exempel kommer att skriva ut:

;Utdata:
:I am bar.
:I am bar.
:I am bar.
:I am r.
:Varning

Observera att variabla variabler inte kan användas med PHP:s Superglobala arrayer inom funktioner eller klassmetoder. Variabeln $this är också en speciell variabel som inte kan refereras dynamiskt.