Andrea: Variable in einer Variable ändern

Hallo an die PHP Experten und Kundigen,

ich habe eine Variable in einer Variable, wobei ich die zweite später immer wieder ändern möchte.

Mein erster Ansatz war dieser:

<?php

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


echo $ausgabe;
echo'<br/>';

$var_platzhalter='Königin';

echo $ausgabe;
echo'<br/>';

?>

der aber nicht von Erfolg gekrönt war, da sich die Variable in der Varibale nicht ändern lies.


<?php
$ausgabe = array(array("Sehr geehrte Frau", ""));
$ausgabe[0][1]='Bundeskanzler';


echo $ausgabe[0][0].' '.$ausgabe[0][1];
echo'<br/>';


$ausgabe[0][1]='Königin';
echo $ausgabe[0][0].' '.$ausgabe[0][1];
echo'<br/>';
?>

Dann habe ich es mit einem Array gemacht und es funktioniert. Wäre das Okey, oder habe ich es zu kompliziert gemacht, und es gibt eine elegantere Lösung?

Andrea

  1. 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
    1. @@Rolf B

      XHMTL zu produzieren - also ein HTML, das sich als valides XML verarbeiten lässt

      Nein, XHTML ist HTML, das als XML verarbeitet wird.

      HTML, das sich als XML verarbeiten lässt, ist polyglottes HTML; s.a. Folie 7.

      Es ist übrigens <br> und nur im Ausnahmefall <br />. […] reicht <br>.

      IMHO fördert es die Lesbarkeit von HTML-Code, wenn man leere Elemente als solche kennzeichnet. Es schadet nicht, polyglottes HTML zu schreiben (d.h. auch Element- und Attributbezeichner in Kleinbuchstaben; Attributwerte immer in Anführungszeichen), auch wenn man nicht vorhat, das als XHTML zu verarbeiten.

      Das Leerzeichen ist übrigens nicht erforderlich; es reicht <br/>.

      🖖 Живи довго і процвітай

      --
      When the power of love overcomes the love of power the world will know peace.
      — Jimi Hendrix
  2. Hallo,

    Mein erster Ansatz war dieser:

    
    > <?php
    > 
    > $var_platzhalter ='Bundeskanzler';
    > $ausgabe ='Sehr geehrte Frau '. $var_platzhalter;
    > 
    > 
    > echo $ausgabe;
    > echo'<br/>';
    > 
    > $var_platzhalter='Königin';
    > 
    > echo $ausgabe;
    > echo'<br/>';
    > 
    > ?>
    
    

    Du hast vermutlich nach sowas gesucht:

     <?php
    $var_platzhalter ='Bundeskanzler';
    echo 'Sehr geehrte Frau '. $var_platzhalter;
    $var_platzhalter='Königin';
    echo 'Sehr geehrte Frau '. $var_platzhalter;
    
    

    Kurt

  3. Hello,

    Hallo an die PHP Experten und Kundigen,

    ich habe eine Variable in einer Variable, wobei ich die zweite später immer wieder ändern möchte.

    Mein erster Ansatz war dieser:

    <?php
    
    $var_platzhalter ='Bundeskanzler';
    $ausgabe ='Sehr geehrte Frau '. $var_platzhalter;
    
    
    echo $ausgabe;
    echo'<br/>';
    
    $var_platzhalter='Königin';
    
    echo $ausgabe;
    echo'<br/>';
    
    ?>
    

    der aber nicht von Erfolg gekrönt war, da sich die Variable in der Varibale nicht ändern liesß.

    Du musst immer beachten, zu welcher Laufzeit die Zuweisung stattfinden soll.

    Wenn Du also in deinem Fall "Bundeskanzlerin" gegen "Königin" austauschen willt, musst Du beachten, wann Du welcher Variable den neunen Inhalt zuweist, und wann Du welche Variable anzeigen lässt.

    Generell werden PHP-Scripte immer Top-Down ausgeführt. Dann gibt es selbstverständlich noch Schleifen und Referenzen.

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.