1. Erläuterungen
Gewöhnlich wird auf Variablen anhand eines festen Namens zugegriffen. In PHP ist es aber auch möglich, den Namen der Variablen wiederum von einer anderen Variablen, einer Funktion oder einer Konstanten abhängig zu machen. Soll als Variablenname der Inhalt einer anderen Variable verwendet werden, dann reicht es, ein zweites Dollarzeichen vor die Variable zu schreiben, sonst müssen geschweifte Klammern verwendet werden.
2. Beispiel: Variablenname von einer anderen Variablen abhängig machen
Das nachfolgende Beispiel stellt dar, wie auf $var2 zugegriffen werden kann, ohne direkt $var2 zu schreiben:
<?php // Beispielvariablen festlegen // zu beachten: $var1 enthaelt den Namen von $var2 $var1 = 'var2'; $var2 = 'beispiel'; // Beispielvariablen ausgeben var_dump($var1, $var2); // Variabler Variablenname // $$var1 wird zu $var2 (da $var1 den String 'var2' enthaelt) // und das wird wiederum zu 'beispiel', da $var2 diesen String enthaelt var_dump($$var1); ?>
string(4) "var2" string(8) "beispiel" string(8) "beispiel"
3. Beispiel: Variablenname von einer Konstanten, einem Array-Wert oder einer Funktion abhängig machen
Auch aus anderen Quellen darf der Name der Variable entnommen werden. Dann ist allerdings die Verwendung von geschweiften Klammern in der Form ${Quelle} notwendig.
<?php $var2 = 'beispiel'; var_dump($var2); // Quelle ist eine Konstante define('EXAMPLE_CONSTANT', 'var2'); var_dump( ${EXAMPLE_CONSTANT} ); // Quelle ist ein Array-Wert $tmp = array(0 => 'var2'); var_dump( ${$tmp[0]} ); // Quelle ist eine Funktion function example() { return 'var2'; } var_dump( ${example()} ); ?>
string(8) "beispiel" string(8) "beispiel" string(8) "beispiel" string(8) "beispiel"
4. Beispiel: Variablenname noch indirekter festlegen
Die variable Generierung des Variablennamens darf beliebig indirekt sein. Man ist also sozusagen nicht auf zwei Dollarzeichen beschränkt, sondern darf auch mehr verwenden. Will man seinen eigenen Code so unlesbar wie nur möglich gestalten, dann kann man dem nächsten Beispiel folgen, in dem $var1 auf $var2 verweist, $var2 wiederum auf $var3, $var3 auf $var4 und erst $var4 den tatsächlichen Wert enthält.
<?php $var1 = 'var2'; $var2 = 'var3'; $var3 = 'var4'; $var4 = 'beispiel'; var_dump($var1, $var2, $var3, $var4); echo('$var1: ' . $var1 ." \n"); echo('$$var1: ' . $$var1 ." \n"); echo('$$$var1: ' . $$$var1 ." \n"); echo('$$$$var1: ' . $$$$var1 ." \n"); ?>
string(4) "var2" string(4) "var3" string(4) "var4" string(8) "beispiel" $var1: var2 $$var1: var3 $$$var1: var4 $$$$var1: beispiel
5. Beispiel: Variabler Zugriff auf Felder von Objekten
Genauso variabel darf auf Felder von Objekten zugegriffen werden, hier dargestellt am Beispiel der Klasse „Example” mit dem Feld „myVar”.
<?php class Example { public $myVar = 'example'; } $example = new Example(); $name = 'myVar'; var_dump($example->myVar); var_dump($example->$name); var_dump($example->{$name}); ?>
string(7) "example" string(7) "example" string(7) "example"
6. Beispiel: Objekt als Name verwenden
Zur Ermittlung des Variablennamens können sogar Objekte verwendet werden. Voraussetzung ist, dass das Objekt über eine __toString()-Methode verfügt, sich also in einen String umwandeln lässt.
<?php class Example { public function __toString() { return 'var2'; } } $var2 = 'beispiel'; var_dump($var2); var_dump( ${new Example()} ); ?>
string(8) "beispiel" string(8) "beispiel"
7. Beispiel: SQL-Ergebnisse leichter in Objekte übertragen
Variable Variablennamen können verwendet werden, um die Ergebnisse von SQL-Selects leichter in Objekte zu übertragen. Nachfolgend wird ein Datensatz eines Users aus der Datenbank geladen und in ein User-Objekt übertragen.
<?php // Eine beispielhafte User-Klasse class User { public $id; public $username; public $email; } // SQL-Selects hier, die das nachfolgende Array ergeben: $userRow = array('id' => '46713', 'username' => 'johnDoe55', 'email' => 'john@doe.name'); // Instanz eines User-Objekts erzeugen in das wir die Daten uebertragen wollen $user = new User(); // Daten uebertragen foreach ($userRow as $columnName => $columnValue) { $user->{$columnName} = $columnValue; } // Neue Werte des User-Objekts ausgeben var_dump($user); ?>
object(User)#1 (3) { ["id"]=> string(5) "46713" ["username"]=> string(9) "johnDoe55" ["email"]=> string(13) "john@doe.name" }
Wer keine public-Felder will, der kann sich der Methode __set() bedienen:
<?php // Eine beispielhafte User-Klasse class User { private $id; private $username; private $email; public function __set($name, $value) { if ($name === 'id') { $this->id = intval($value); } else { $this->{$name} = $value; } } } // SQL-Selects hier, die das nachfolgende Array ergeben: $userRow = array('id' => '46713', 'username' => 'johnDoe55', 'email' => 'john@doe.name'); // Instanz eines User-Objekts erzeugen in das wir die Daten uebertragen wollen $user = new User(); // Daten uebertragen foreach ($userRow as $columnName => $columnValue) { $user->{$columnName} = $columnValue; } // Neue Werte des User-Objekts ausgeben var_dump($user); ?>
object(User)#1 (3) { ["id":"User":private]=> int(46713) ["username":"User":private]=> string(9) "johnDoe55" ["email":"User":private]=> string(13) "john@doe.name" }