sandra: global $GLOBALS; ?

Hi,

ich habe eine winzige function, die mir einzelne Blöcke auf meiner Website einfügt und auch phps included. Die includeten phps sollen Zugriff auf alle gesetzen variablen der Site haben. Dadurch, dass sie aber durch eine function aufgerufen werden, ist das momentan nicht so.

Kann ich in der function irgendwie ALLE Variablen integrieren?

Also sowas wie global $GLOBALS; (geht nicht) oder global all; (geht nicht).

Danke für eure Hilfe
LG

  1. Hallo,

    Dadurch, dass sie aber durch eine function aufgerufen werden, ist das momentan nicht so.

    $foo = 'hund';  
    function bar(){  
        echo $foo; // sollte funktionieren  
        $bla = 'katze';  
        return true;  
    }  
    bar();  
    echo $bla; // sollte nicht funktionieren
    

    Kann sein dass ich zur Zeit bisschen viel C++ lese aber innerhalb einer Funktion stehen die ausserhalb deklarierten Variablen eigentlich zur Verfügung.

    Hab ich etwas falsch verstanden oder durcheinander gebracht?

    Grüße, Matze

    1. $foo = 'hund';

      function bar(){
          echo $foo; // sollte funktionieren
          $bla = 'katze';
          return true;
      }

        
      funktioniert nicht  
      richtig wäre:  
        
      ~~~php
      $foo = 'hund';  
      function bar(){  
          global $foo;  
          echo $foo; // funktioniert  
          $bla = 'katze';  
          return true;  
      }
      
      1. global extract($GLOBALS); // Syntaxerror

        Übergabe von $GLOBALS an die Funktion [aufruf_funktion($para1,$para2,$GLOBALS)] geht auch nicht.

        Mir gehen die Denkansätze aus..

      2. Hallo

        $foo = 'hund';

        function bar(){
            echo $foo; // sollte funktionieren
            $bla = 'katze';
            return true;
        }

        
        >   
        > funktioniert nicht  
        > richtig wäre:  
        >   
        > ~~~php
        
        $foo = 'hund';  
        
        > function bar(){  
        >     global $foo;  
        >     echo $foo; // funktioniert  
        >     $bla = 'katze';  
        >     return true;  
        > }
        
        

        ... oder

        $foo = 'hund';  
        function bar($foo){  
            echo $foo; // funktioniert  
            $bla = 'katze';  
            return $bla;  
        }  
        $bla = bar($foo);  
        echo $bla; // funktioniert nun auch.
        

        ... womit auch $bla zur Verfügung stünde. Obwohl das *in diesem Szenario* verwirren könnte, da $foo direkt nichts mit $bla zu tun hat. Typischerweise prüft oder manipuliert man ja in einer Funktion den Eingabewert. Somit bekommt man eine Prüfausgabe (z.B. true, false, Zahlenwert oder ein Array wie bei getimagesize) oder die veränderte Eingabe zurück.

        Für deinen Fall solltest du dir überlegen, inwieweit du im globalen Scope arbeitest, wo in allen includeten Skripten alle Variablen zur Verfügung stehen (Achtung: Namenskonflikte möglich), oder was du in welchen Skripten in Funktionen kapselst. Für die Funktionen wäre dann zu überlegen, was als Parameter übergeben werden kann/soll und was per global auch innerhalb der Funktionen zur Verfügung stehen soll. Bei global musst du allerdings alle Variablen einzeln angeben.

        Für den Fall, dass Variablen Benutzerdaten enthalten (z.B. Formulareingaben oder Daten angemeldeter Benutzer) bietet sich (je nach Fall) die konsequente Nutzung von $_GET, $_POST, $_COOKIE oder $_SESSION als Speicher für diese Daten an, da diese Arrays von sich aus superglobal sind, also sowohl innerhalb als auch außerhalb von Funktionen zur Verfügung stehen.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        Veranstaltungsdatenbank Vdb 0.3
        1. Dein Beispiel ist mir natürlich auch bekannt.

          Ich habe habe wie gesagt sehr viele Variablen, die an verschiedenen Stellen auch mehrfach verwendet werden.
          Die Funktion ist wie gesagt auch sehr klein und eine temporäre Hilfsfunktion. Sieht ungefähr so aus:

          function show_nav_block($name,$id,$class) {  
          	echo "<div id='$id' class='shadow $class'><div class='oben'></div><div class='mid'>";  
          	include("nav_blocks/$name.php");  
          	echo '</div><div class="unten"></div></div>';  
          }
          

          Wollte eben einfach nur, dass wenn ich änderungen an den nav_blocks machen möchte, ich nicht jeden einzeln behandeln muss. Also die Grundstruktur halt immer die selbe ist.

          Da dies anscheind nicht möglich ist, werde ich jetzt halt einfach die dateien ohne function includen und über und unter dem include jeweils ein include für template_head und eins für template_foot machen (ist zwar nicht wirklich hübsch, aber wie gesagt, ist für eine temporäre programmierungsumgebung.

          Außer natürlich, euch fällt noch ein besserer Ansatz ein.

          LG

          1. Hallo

            Dein Beispiel ist mir natürlich auch bekannt.

            Ich habe habe wie gesagt sehr viele Variablen, die an verschiedenen Stellen auch mehrfach verwendet werden.
            Die Funktion ist wie gesagt auch sehr klein und eine temporäre Hilfsfunktion. Sieht ungefähr so aus:

            function show_nav_block($name,$id,$class) {

            echo "<div id='$id' class='shadow $class'><div class='oben'></div><div class='mid'>";
            include("nav_blocks/$name.php");
            echo '</div><div class="unten"></div></div>';
            }

            
            >   
            > Wollte eben einfach nur, dass wenn ich änderungen an den nav\_blocks machen möchte, ich nicht jeden einzeln behandeln muss. Also die Grundstruktur halt immer die selbe ist.  
              
            Wie wäre es dann damit, nicht den Namen der Datei, in der die Struktur zusammengebaut ist, zu übergeben, sondern ein Array, das die Infos zur Navigation enthält. Die Navi würde dann ausschließlich in dieser Funktion erstellt.  
              
            Beispiel:  
              
            ~~~php
            function buildNav($array,$id,$class) {  
            $r = "<ul id=\"".$id."\" class=\"shadow, ".$class."\">";  
            foreach ($array as $item) {  
            $r .= "<li><a href=\"".$item["url"]."\">".$item["text"]."</a>";  
            }  
            $r .= "</ul>";  
              
            return $r;  
            // alternativ: echo $r;  
            }  
              
            $navArray = array(  
            array("url"=>"/pfad/zu/seite1","text"=>"Seite 1"),  
            array("url"=>"/pfad/zu/seite2","text"=>"Seite 2"),  
            array("url"=>"/pfad/zu/seite3","text"=>"Seite 3"));  
              
            echo buildNav($navArray, $id, "klassenname");
            

            Jetzt käme es nur darauf an, dass du peu a peu die richtigen Arrays an die Funktion übergibst. Auf die Weise würdest du einerseits den Code wiederverwendbar machen und andererseits diverse Includes sparen.

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
            Terry Pratchett, "Wachen! Wachen!"
            Veranstaltungsdatenbank Vdb 0.3
    2. Hello,

      Kann sein dass ich zur Zeit bisschen viel C++ lese aber innerhalb einer Funktion stehen die ausserhalb deklarierten Variablen eigentlich zur Verfügung.

      Hab ich etwas falsch verstanden oder durcheinander gebracht?

      Ja, in PHP ist das nicht so, wie bei fast allen implizit deklarierenden Sprachen.
      Variablen, sie außerhalb einer Funktion deklariert (also angelegt wurden), sind bei PHP innerhalb der Funktion erstmal nicht sichtbar, es sei denn, dass man sie dort auch wieder mit

      global variablenname;

      auf den Gültigkeitsbereich von außerhalb legt.

      http://www.php.net/manual/en/language.variables.scope.php

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  2. [latex]Mae  govannen![/latex]

    Also sowas wie global $GLOBALS; (geht nicht)

    Wozu auch? Das Array $GLOBALS _ist_ bereits global und steht allen Funktionen zur Verfügung, was denkst du, wie es zu seinem Namen kam?

    Cü,

    Kai

    --
    Resig is more like Javascript's Pee Wee Herman.  ;) (D.Mark in clj)
    Foren-Stylesheet Site Selfzeug JS-Lookup
    SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
    1. Wozu auch? Das Array $GLOBALS _ist_ bereits global und steht allen Funktionen zur Verfügung, was denkst du, wie es zu seinem Namen kam?

      Innerhalb von Funktionen ist das anscheinend nicht so. Sonst müsste man nicht gloable Variablen erneut als solche deklarieren (global $Varaiblenname;)

      1. [latex]Mae  govannen![/latex]

        Wozu auch? Das Array $GLOBALS _ist_ bereits global und steht allen Funktionen zur Verfügung, was denkst du, wie es zu seinem Namen kam?

        Innerhalb von Funktionen ist das anscheinend nicht so. Sonst müsste man nicht gloable Variablen erneut als solche deklarieren (global $Varaiblenname;)

        Doch. Ich rede von $GLOBALS, nicht von anderen Variablennamen. global $GLOBALS wäre daher sehr sinnfrei.

        Cü,

        Kai

        --
        Resig is more like Javascript's Pee Wee Herman.  ;) (D.Mark in clj)
        Foren-Stylesheet Site Selfzeug JS-Lookup
        SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
      2. Hello,

        Wozu auch? Das Array $GLOBALS _ist_ bereits global und steht allen Funktionen zur Verfügung, was denkst du, wie es zu seinem Namen kam?

        Innerhalb von Funktionen ist das anscheinend nicht so. Sonst müsste man nicht gloable Variablen erneut als solche deklarieren (global $Varaiblenname;)

        Dann schau Dir mal
        http://www.php.net/manual/en/reserved.variables.globals.php an und das
        Beispiel #2 auf der Seite
        http://www.php.net/manual/en/language.variables.scope.php

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  3. Hello,

    ich habe eine winzige function, die mir einzelne Blöcke auf meiner Website einfügt und auch phps included. Die includeten phps sollen Zugriff auf alle gesetzen variablen der Site haben. Dadurch, dass sie aber durch eine function aufgerufen werden, ist das momentan nicht so.

    Kann ich in der function irgendwie ALLE Variablen integrieren?

    Also sowas wie global $GLOBALS; (geht nicht) oder global all; (geht nicht).

    Trenne das Includen von Code und dessen Ausführung so gut es geht voneinander. Ein eingebundenes Modul sollte also am besten überhaupt keinen Code ausführen. Das sollte erst dann geschehen, wenn eine Klasse daraus instatiiert wird oder eine Funktion daraus benutzt wird.

    Diese Forserung lässt sich nicht immer realisieren, manchmal _kann_ es sinnvoll sein, dass durch die Einbundung alleine bereits Code ausgeführt wird. Aber diese Fälle sollten immer Sonderfälle bleiben.

    Wenn Du das Ganze nun so aufbaust, dass eben erst eine Instanz aufgebaut werden muss, dann kannst Du der auch eine Referenz auf einen globalen Wertecontainer des Haupt-Scriptes übergeben. Dann können die Funktionen oder Methoden alle darin enthaltenen Elemente erreichen.

    Alternativ arbeitest Du gleich sauber mit Vererbung, was aber die Planung aufwändiger macht.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de