Variable Variablen (Thema: PHP Beispiele)

Wie die Namen von Variablen in PHP flexibilisiert werden können

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.

wichtig
In der Regel deutet die Verwendung von variablen Variablennamen auf schlechtes Codedesign hin. Derartige Konstruktionen sind für andere Entwickler schwer zu lesen und sollten daher vermieden werden. Häufig können sie durch Arrays ersetzt 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-Code
<?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);
?>

PHP-Code: Ausgabe
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-Code
<?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()} );
?>

PHP-Code: Ausgabe
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-Code
<?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");
?>

PHP-Code: Ausgabe
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-Code
<?php
	class Example {
		public $myVar = 'example';
	}
	
	$example = new Example();
	$name = 'myVar';
	var_dump($example->myVar);
	var_dump($example->$name);
	var_dump($example->{$name});
?>

PHP-Code: Ausgabe
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-Code
<?php
	class Example {
		public function __toString() {
			return 'var2';
		}
	}
	
	$var2 = 'beispiel';
	var_dump($var2);
	var_dump( ${new Example()} );
?>

PHP-Code: Ausgabe
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-Code
<?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);
?>

PHP-Code: Ausgabe
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-Code
<?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);
?>

PHP-Code: Ausgabe
object(User)#1 (3) {
  ["id":"User":private]=>
  int(46713)
  ["username":"User":private]=>
  string(9) "johnDoe55"
  ["email":"User":private]=>
  string(13) "john@doe.name"
}


Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung. OK