Rolf B: Variable in einer Variable ändern

Beitrag lesen

Hallo Andrea,

ich habe eine Variable in einer Variable

$ausgabe = 'Sehr geehrte Frau ' . $var_platzhalter;

Nein, das hast Du nicht. Du hast einen Ausdruck (nicht Papierausdruck; "Ausdruck" ist ein Programmiersprachenbegriff für eine Vorschrift, wie der Computer Dinge aus anderen Dingen ermittelt), der eine konstante Zeichenkette mit dem Inhalt von $var_platzhalter verkettet und in $ausgabe ablegt. Ja, richtig gelesen, das Abspeichern in $ausgabe ist Teil des Ausdrucks. Das = ist in PHP auch nur ein Operator, so wie +, - oder ..

Dieser Ausdruck wird in dem Moment vollständig ausgewertet, wo PHP ihn antrifft, und in der $ausgabe Variablen ist nun keine Spur mehr davon zu finden, dass ein Teil des Inhalts aus $var_platzhalter stammt.

Das wäre auch keine gute Programmierung. Du hättest dann eine Variable, die heimlich Bezug auf eine andere Variable nimmt. Das ist eine versteckte Abhängigkeit, die in größeren Programmen schnell zu Fehlern führt. Beim Programmieren möchte man das vermeiden. Je deutlicher Abhängigkeiten zu erkennen sind, desto weniger kann man sie übersehen.

Dein Array-Konstrukt ist anders, da werden die Anrede und der Titel getrennt als Array-Elemente gespeichert und erst bei der Ausgabe zusammengesetzt. Darum kannst Du einen Array-Eintrag später ändern und es funktioniert. Ob Du tatsächlich ein zweidimensionales Array brauchst? Das hängt von deinen Anforderungen ab, für das Beispiel hätte auch ein einfaches Array genügt:

Es ist übrigens sehr sinnvoll, Variablen nach ihrem Inhalt zu benennen, ich würde das Ding $anrede, nicht $ausgabe nennen.

$anrede = array('Sehr geehrte Frau', 'Bundeskanzlerin');

echo $anrede[0] . ' ' . $anrede[1];

Für Arrays gibt's in PHP eine recht praktische Funktion namens implode, die alle Werte in einem Array aneinanderhängt. Zusätzlich kann man eine Zeichenkette angeben, die jeweils dazwischen zu setzen ist. In deinem Fall die Leerstelle. Das <br> kann man in einem separaten echo ausgeben oder gleich hinten anhängen. Anhängen sähe so aus:

echo implode(' ', $anrede) . '<br>';

Es ist übrigens <br> und nur im Ausnahmefall <br />. Hast du die Anforderung, XHMTL zu produzieren - also ein HTML, das sich als valides XML verarbeiten lässt? Wenn nicht, reicht <br>.

Ob diese Vorgehensweise für dein Programm ideal ist, kann man schwer sagen. Hast Du die Aufgabe, zu einem gegebenen Titel (oder Namen) weibliche Anredefloskeln zu generieren? Man könnte das auch mit einer selbstgeschriebene Funktion lösen:

function Anrede_w($titel)
{
   return 'Sehr geehrte Frau ' . $titel . ',';
}

echo Anrede_w('Bundeskanzlerin') . '<br>';
echo Anrede_w('Königin') . '<br>';
echo Anrede_w('Piependeckel') . '<br>';

Wichtig ist hier, dass der echo und die Ausgabe von <br> nicht in der Funktion erfolgt. Natürlich könnte man das tun, aber die Anrede-Erzeugung würde damit auf den Zweck der sofortigen Ausgabe eingeschränkt. Wenn man Erzeugung und Ausgabe trennt, verbessert das die Wiederverwendbarkeit der erzeugten Anrede. Das ist ein Grundprinzip beim Erstellen von Bausteinen: Mach Genau Eine Sache, aber die richtig.

Statt mit einer Verkettung von Zeichenketten zu arbeiten, kann man auch noch ein anderes PHP Feature nutzen: Variableninterpolation (im PHP Handbuch heißt das "string parsing"). PHP Zeichenketten können in einfachen oder doppelten Anführungszeichen stehen. String parsing findet nur statt, wenn doppelte Anführungszeichen verwendet werden, und es bedeutet, dass PHP in die Zeichenkette hineinschaut, ob darin eine Variable steht. Du könntest in der Funktion also auch schreiben:

   return "Sehr geehrte Frau $titel,";

und PHP würde die Variable $titel durch den Wert des Funktionsparameters ersetzen. Aber - das geschieht ebenfalls sofort und nicht erst später, wenn der Wert verwendet wird, deshalb ist auch dies kein Ansatz um deine ursprüngliche Frage zu lösen.

Die Anrede_w Funktion schreit vermutlich schnell nach Verbesserungen, wie z.B. ein zweiter Parameter, um männliche und weibliche Anreden erzeugen zu können, oder eine formale und nicht formale Anrede. Ich weiß aber nicht, wie weit Du schon in Programmierlogik eingestiegen bist, um das aufnehmen zu können.

Rolf

--
sumpsi - posui - obstruxi