1. Erläuterungen
Der Name von Variablen kann in Abhängigkeit vom Rückgabewert einer Funktion festgelegt werden. Die Syntax dafür lautet
${ foo() } = ...;
wobei foo() eine beliebige Funktion ist, die einen Wert zurückgeben muss, der ein String ist oder sich zumindest in einen String umwandeln lässt. (Es darf übrigens selbst ein leerer String zurückgegeben werden.)
2. Beispiel: Einfacher Rückgabewert
In diesem Beispiel gibt die Funktion foo() den Namen der Variable zurück, welcher „bar” ist. Dieser Variable wird der Wert „test” zugewiesen.
<?php function foo() { return 'bar'; } ${foo()} = 'test'; var_dump( ${foo()}, $bar ); ?>
string(4) "test" string(4) "test"
3. Beispiel: Komplexere Verkettung
Die Zuweisung kann auch „indirekter” erfolgen. Im nachfolgenden Beispiel wird an foo() eine Callback-Funktion übergeben, welche wiederum den Wert von $test zurückgibt, der wiederum „st” ist. foo() verknüpft diesen String mit „te” am Anfang, wodurch sich „test” ergibt. Der Variable mit dem Namen „test” wird anschließend der Inhalt „neuer Wert” zugewiesen.
<?php $test = 'st'; function foo($callback) { // $callback() ergibt 'st' return 'te' . $callback(); } $callback = function() use ($test) { return $test; }; ${foo($callback)} = 'neuer wert'; var_dump($test); ?>
string(10) "neuer wert"
4. Beispiel: Monate mit Übersetzung
Das nachfolgende Beispiel durchläuft alle Monate (auf Englisch) und weist den gleichnamigen Variablen die deutsche Übersetzung zu. Am Ende erhält man die Variablen $january, $february, $march usw., welche die Werte „Januar”, „Februar”, „Maerz” usw. enthalten.
<?php function translateMonth($lang, $month) { if ($lang === 'de') { // deutsche Übersetzungen switch ($month) { case 1: return 'Januar'; case 2: return 'Februar'; case 3: return 'Maerz'; // ... } } else if ($lang === 'fr') { // hier könnten die französischen Übersetzungen stehen // ... } else { // englische Standardwerte // werden in diesem Beispiel nicht verwendet switch ($month) { case 1: return 'January'; case 2: return 'February'; case 3: return 'March'; // ... } } } foreach (range(1, 12) as $month) { // der Teil zwischen den geschweiften Klammern ergibt den Monat mit Nummer $month // in Englisch und klein geschrieben ${ strtolower(date('F', mktime(0, 0, 0, $month, 1, 1970))) } = translateMonth('de', $month); } echo('Translated months: ' . $january . ', ' . $february .', ' . $march); ?>
Translated months: Januar, Februar, Maerz