D.R.: Variablen aus Funktion erstellen/ändern und global verwenden

Hallo,

Ich habe die Navigationsleisten meiner Seiten jetzt alle global mit PHP geschrieben. Da diese ohnehin so ziemlich alle Linkziele enthält, dachte ich mir, ich könnte darüber eigentlich auch den Aufwärts-Button generieren und versuchte, eine globale Variable aus der Funktion zu verändern, wie ich es auch JavaScript gewohnt war (natürlich mit „$“ davor). Leider ging genau das nicht :-(
Auch kann man mit PHP ja nicht auf beliebige Stellen im Quelltext zugreifen, sodass echo immer dort wirkt, wo es eingesetzt wird.

Deshalb meine Frage: Gibt es irgendeine andere Möglichkeit, dies zu realisieren? Eine Konstante finde ich für diesen Zweck irgendwie unlogisch.

Oder muss ich auf die Funktion verzichten, die Parameter in ein Array setzen, eine Variable erzeugen (die dann die kompl. Navi enthält) und diese dann per echo ausgeben?
Ich finde eine Funktion aber übersichtlicher. Andererseits muss sie aber wirklich nur 1x pro Seite aufgerufen werden…

Danke schon mal im voraus!

mfg. Daniel

  1. echo $begrüßung;

    [...] eine globale Variable aus der Funktion zu verändern, wie ich es auch JavaScript gewohnt war [...]

    Ja, PHP ist ja auch nicht Javascript. :-) So wie du das momentan zu tun gedenkst brauchst du das Wissen aus dem Kapitel Variable scope. Doch das ist nicht die optimale Methode. Idealerweise sollten Funktionen so geschrieben sein, dass sie Parameter entgegennehmen, etwas berechnen und ein Ergebnis zurückgeben. Das Zugreifen auf globale Variablen sollte man vermeiden. Wenn man sich die Stelle ansieht, an der die Funktion aufgerufen wird, ist nicht so ohne weiteres zu erkennen, dass sich dadurch der Inhalt einer Variablen ändern kann, oder dass dieser für die Funktion relevant ist, obwohl er ihr gar nicht übergeben wurde. Auch die Wiederverwendbarkeit einer Funktion leidet, wenn sie auf globale Dinge angewiesen ist.

    Auch kann man mit PHP ja nicht auf beliebige Stellen im Quelltext zugreifen, sodass echo immer dort wirkt, wo es eingesetzt wird.

    Bei diesem Satz verstehe ich nicht, was du damit meinst.

    echo "$verabschiedung $name";

    1. Hallo,

      Auch kann man mit PHP ja nicht auf beliebige Stellen im Quelltext zugreifen, sodass echo immer dort wirkt, wo es eingesetzt wird.

      Bei diesem Satz verstehe ich nicht, was du damit meinst.

      Das ist wieder so ein (dummer) JavaScript-Vergleich von mir. dort kann man ja z.B. schreiben:

      document.getElementById("IDbeideretwasgeändertwerdesoll").href = Linkarray[3];

      Das geht mit PHP aber nicht.

      Ansonsten:

      danke an euch beide für eure nette Hilfe. Ich denke, „global“ wird für mich wohl oder übel das sein, was ich brauche.

      Vielleicht noch mal zur Verdeutlichung:

        
      $upbutton = "";  
        
      function makeNavi($Nr,$SNNR) {  
        
      $HauptNavi = array(Alle Verweise und Namen der Hauptnavi)  
        
      $SubNavi = array(Alle Subnavi's und davon dann wieder alle Verweise und Namen der Links (verschacheteltes Array))  
        
      (ganz ganz viel Code, der aus dem Array HTML produziert)  
        
      /*  
      Jetzt möchte ich mit Hilfe der Arrays, sowie der „$Nr“ das Linkziel und den Namen für den Aufwärts-Button aus den Array holen und ihn als HTML-Code an „$upbutton“ senden. dieser soll dann an einer ganz best. Stelle im Quellcode eingefügt werden (per echo $upbutton).  
      */  
      }  
      
      

      Ich werd's erstmal mit „global“ versuchen. Für bessere Vorschläge bin ich natürlich immer offen.

      mfg. Daniel

      1. echo $begrüßung;

        document.getElementById("IDbeideretwasgeändertwerdesoll").href = Linkarray[3];
        Das geht mit PHP aber nicht.

        Doch, das geht schon. Nur solltest du bedenken, dass in Javascript oftmals ein Element etwas Sichtbares darstellt, das sich sofort verändert, wenn man seine Eigenschaften ändert.
        PHP erzeugt zunächst nur Unsichtbares. Es wäre aber kein Problem, die darzustellende Seite mit Objekten aufzubauen, deren Eigenschaften wie gewünscht einzustellen, und dann aus diesen Objekten den HTML-Quelltext zu generieren. Diese Vorgehensweise ist zwar für "Wald- und Wiesen-Scripte" überdimensioniert, doch bei komplexen Anwendungen kann man davon Vorteile haben.

        echo "$verabschiedung $name";

      2. Hallo,

        Ich werd's erstmal mit „global“ versuchen.

        „global“ war doch nicht das richtige, da man Variablen damit anscheinend nicht verändern kann. Habe das Ganze jetzt mit $GLOBALS["Variablenname"] gemacht. Funzt einwandfrei.

        Wegen der Portierbarkeit der Funktion: dürfte eigentlich keine Probleme bereiten, da selbige keine Variablen ausliest, sondern sie lediglich erstellt. Was dann damit gemacht wird, ist ja im Prinzip egal. Man muss sie nicht nutzen…

        mfg. Daniel

  2. Hi D.R. (hehe, meine Initialien :-),

    Ich bin mir grad nicht so ganz sicher, ob ich dich richtig verstanden habe, aber prinzipiell geht das in PHP schon:

    // globale Variable definieren  
    $autor = "Ihr Name";  
      
    // Funktion definieren  
    function wer_ist_der_autor() {  
      // globale Variable holen  
      global $autor;  
      // und ausgeben  
      echo "Der Autor ist $autor.";  
    }  
      
    // Funktionsaufruf  
    wer_ist_der_autor();
    

    Per global kannst du also eine oder mehrere Variablen aus dem globalen Gültigkeitsbereich in den Gültigkeitsbereich der Funktion hereinholen.

    Das Problem damit ist allerdings, dass dies extrem schlechter Stil ist, desshalb hier ein paar alternative Vorschläge:

    $autor = "Ihr Name";  
      
    function wer_ist_der_autor($name) {  
      echo "Der Autor ist $name.";  
    }  
      
    wer_ist_der_autor($autor);
    

    Hier wird die benötigte Variable also einfach als Parameter übergeben, ich gehe mal davon aus, dass du dies kennst. Wenn du mehrere Werte übergeben willst, kannst du die auch alle in ein assoziertes Array packen und als ein Parameter übergeben. Parameter können übrigens auch optional sein.

    Das Problem hiermit ist allerdings, wenn du innerhalb der Funktion Änderungen an $name vornimmst, sind diese nicht außerhalb der Funktion verfügbar. Dagegen ist auch ein Kraut gewachsen:

    $autor = "Ihr Name";  
      
    // Was steht in $autor drin?  
    echo $autor;    // gibt Ihr Name aus  
      
    function bearbeite_autor(&$name) {  
      $name = "(" . $name . ")";  
    }  
      
    // Funktion aufrufen  
    bearbeite_autor($autor);  
      
    // Und was steht jetzt in $autor drin?  
    echo $autor;    // gibt (Ihr Name) aus
    

    Mit einem &-Zeichen vor dem Variablen-Namen in der Funktionsdefinition kannst du Variablen als Referenz übergeben, dadurch werden Änderungen im Original vorgenommen und sind somit nach Ablauf der Funktion im globelen Wertebereich verfügbar.

    In simplen Fällen kannst du natürlich auch einfach nur einen Wert als Rückgabe der Funktion weiterverarbeiten. Bei komplexeren Funktionen mag der Einsatz von einem Rückgabewert und die Nutzung von Referenzen (z.B. für zusätzl. Informationen) sinnvoll sein.

    Viele Grüße aus Kanada,
      ~ Dennis.