Kalle_B: global all;

Hallöle,

bei einem Gruppenwechsel habe ich einigen Code zum Abschluss der alten Gruppe. Diesen Code brauche ich zum Abschluss der letzten Gruppe hinter

while ( $row = ... )

noch mal. Code zweimal schreiben ist änderungsaufwändig und fehlerträchtig, also habe ich ihn in eine Funktion gepackt, die von den zwei Stellen angesprungen wird.

Doch nun muss ich in der Funktion jede Variable als "global" aufrufen, was wiederum zu Fehlern führt, wenn eine dazugekommene Variable dort nicht nachgepflegt wird.

Ich möchte in diese Funktion sämtliche Variablen benutzen und verändern. Wie geht das?

global all; funzt nicht, bei php.net/global keine Idee gefunden.

Lieben Gruß, Kalle

  1. Lieber Kalle_B,

    wenn ich in PHP globale Variablen benötige, dann stecke ich diese in das ohnehin schon vorhandene superglobale Array $_SERVER. Dazu lege ich in $_SERVER einfach ein Unterarray an.

    $_SERVER['meine_vars'] = array(  
        'meine_var1' => $mein_wert1,  
        'meine_var2' => $mein_array_als_wert2,  
        'meine_var3' => 12345  
    )
    

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hello,

      wenn ich in PHP globale Variablen benötige, dann stecke ich diese in das ohnehin schon vorhandene superglobale Array $_SERVER. Dazu lege ich in $_SERVER einfach ein Unterarray an.

      $_SERVER['meine_vars'] = array(

      'meine_var1' => $mein_wert1,
          'meine_var2' => $mein_array_als_wert2,
          'meine_var3' => 12345
      )

        
      Aber doch wohl nicht, bevor Du geprüft hast, ob es ein solches Array schon gibt?  
        
      if (isset($\_SERVER['meine\_vars']))  
      {  
        ## nun hat Felix ein Problem  
      }  
        
        
      $\_SERVER hat eine andere Bestimmung als z.B. $GLOBALS, was für den Zweck eigener Werte, die nur die Lebensdauer des Scriptes haben sollen, die passende Stelle wären.  
        
      Man sollte die von PHP vorgesehene Strukturierung der Datenbereiche nicht zerstören!  
        
        
      Harzliche Grüße vom Berg  
      <http://www.annerschbarrich.de>  
        
      Tom
      
      -- 
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen  
      Nur selber lernen macht schlau  
      ![](http://bitworks.de/~selfHTML/Virencheck.gif)  
      
      
      1. Lieber Tom,

        $_SERVER['meine_vars'] = array(
            'meine_var1' => $mein_wert1,
            'meine_var2' => $mein_array_als_wert2,
            'meine_var3' => 12345
        )

        if (isset($_SERVER['meine_vars']))
        {
          ## nun hat Felix ein Problem
        }

        Also besser so?

        // Anfang des Scripts  
        $_SERVER['meine_vars'] = array(  
            'meine_var1' => false,  
            'meine_var2' => false,  
            'meine_var3' => false  
        );  
          
          
        // später im Script  
        $_SERVER['meine_vars']['meine_var1'] = $irgendwas_gerade_aktuelles;  
          
        // noch später im Script  
        $_SERVER['meine_vars']['meine_var2'] = $irgendwas_anderes;  
          
        // usw.
        

        $_SERVER hat eine andere Bestimmung als z.B. $GLOBALS, was für den Zweck eigener Werte, die nur die Lebensdauer des Scriptes haben sollen, die passende Stelle wären.

        Also in etwa so?

        // Anfang des Scripts  
        $GLOBALS['meine_vars'] = array(  
            'meine_var1' => false,  
            'meine_var2' => false,  
            'meine_var3' => false  
        );  
          
          
        // später im Script  
        $GLOBALS['meine_vars']['meine_var1'] = $irgendwas_gerade_aktuelles;  
          
        // noch später im Script  
        $GLOBALS['meine_vars']['meine_var2'] = $irgendwas_anderes;  
          
        // usw.
        

        Man sollte die von PHP vorgesehene Strukturierung der Datenbereiche nicht zerstören!

        Welchen _technischen_ Unterschied haben $_SERVER und $GLOBALS (mal von der Intention der PHP-Autoren abgesehen)? Ändert es etwas am Verbrauch von Arbeitsspeicher oder der Performanz, wenn man statt des einen das andere verwendet?

        Ich habe kein Problem damit, mein komplettes CMS umzuschreiben, um anstelle von $_SERVER nun $GLOBALS zu verwenden... Aber ich tue es nur, wenn ich einen trifftigen Grund finde - und da überzeugen mich _technische_ Unterschiede am ehesten. :-)

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. echo $begrüßung;

          Welchen _technischen_ Unterschied haben $_SERVER und $GLOBALS (mal von der Intention der PHP-Autoren abgesehen)?

          Auf $GLOBALS['foo'] kann im globalen Kontext auch mit $foo zugegriffen werden. Und umgekehrt stehen in $GLOBALS bereits alle globalen Variablen drin.

          echo "$verabschiedung $name";

          1. Lieber dedlfix,

            Auf $GLOBALS['foo'] kann im globalen Kontext auch mit $foo zugegriffen werden. Und umgekehrt stehen in $GLOBALS bereits alle globalen Variablen drin.

            Danke für Deine Erklärung - ich bin nicht schlauer geworden... :-(

            Ich gebe Dir ein Beispiel:

            <?php  
              
            // Wo ist eine Variable global verfügbar?  
            $will_global_sein = true;  
              
            function test1($param1) {  
             global $will_global_sein;  
                echo "Testmechanismus: $param1<br />";  
                echo "Testvariable global? '"  
                    . (isset($will_global_sein) ? 'ja' : 'nein')  
                    . "'<br />";  
            }  
              
            function test2($param2) {  
             global $will_global_sein;  
                echo "Testmechanismus: $param2<br />";  
                echo "Testvariable global? '"  
                    . (isset($GLOBAL['will_global_sein']) ? 'ja' : 'nein')  
                    . "'<br />";  
            }  
              
            test1('ohne GLOBALS');  
            test2('mit GLOBALS');  
              
            ?>
            

            Der zweite Funktionsaufruf gibt ein "nein" aus... das verstehe ich jetzt wirklich nicht!

            Ich empfinde es als bequemer, wenn ich nicht in jeder Funktion meine Variablen erst auf global schalten muss, sondern wenn ich einfach ein superglobales Array mit meinen Werten über ein Unterarray befüllt habe.

            Warum sollte ich nun auf mein Unterarray in $_SERVER verzichten und lieber zu $GLOBALS wechseln? Und wie ist das, wenn $_SERVER selbst offensichtlich sowieso nur ein Unterarray von $GLOBALS ist??

            Liebe Grüße aus Ellwangen,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. echo $begrüßung;

              . (isset($GLOBAL['will_global_sein']) ? 'ja' : 'nein')
              Der zweite Funktionsaufruf gibt ein "nein" aus... das verstehe ich jetzt wirklich nicht!

              Du hast ein S vergessen.

              Ich empfinde es als bequemer, wenn ich nicht in jeder Funktion meine Variablen erst auf global schalten muss, sondern wenn ich einfach ein superglobales Array mit meinen Werten über ein Unterarray befüllt habe.

              Warum greifst du überhaupt auf globale Variablen auf Funktionen heraus zu? Guter Stil ist das nicht. Konstante Werte lassen sich in Konstanten unterbringen. Veränderliche Werte, die mehreren Funktionen zur Verfügung stehen sollen ... wie wär's mit Objekten?

              Warum sollte ich nun auf mein Unterarray in $_SERVER verzichten und lieber zu $GLOBALS wechseln? Und wie ist das, wenn $_SERVER selbst offensichtlich sowieso nur ein Unterarray von $GLOBALS ist??

              $_SERVER ist wie jede andere globale Variable auch ein Eintrag in $GLOBALS.

              echo "$verabschiedung $name";

              1. Lieber dedlfix,

                Warum greifst du überhaupt auf globale Variablen auf Funktionen heraus zu? Guter Stil ist das nicht. Konstante Werte lassen sich in Konstanten unterbringen. Veränderliche Werte, die mehreren Funktionen zur Verfügung stehen sollen ... wie wär's mit Objekten?

                Naja, wenn Objekte so wandelbar wären, wie sie das in JavaScript sind, wo ich z.B. einem Objekt einfach ein Unterobjekt hinzufügen kann ...
                myObj.box = { deckel : 'wert1', inhalt : 'bla', boden : 'frei' }
                ... um dann im weiteren Scriptverlauf dieses Unterobjekt zu "überschreiben", ...
                myObj.box = function (param) { alert(typeof (param) ); }
                ... dann wäre ich schon längst dabei! Außerdem möchte ich meine Scripte zu PHP 4.3 kompatibel halten, solange PHP4 noch überall (wenn auch neben PHP5) im Einsatz ist. Aber OOP in PHP4 mit diesen Klassen scheint mir längst noch nicht so flexibel zu sein... und ob das in PHP5 eher so flexibel wie in Javascript ist, das weiß ich einfach nicht, da ich in PHP noch nie objektorientiert programmiert habe. Da kenne ich mich einfach nicht aus.

                Liebe Grüße aus Ellwangen,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
                1. echo $begrüßung;

                  Naja, wenn Objekte so wandelbar wären, wie sie das in JavaScript sind, wo ich z.B. einem Objekt einfach ein Unterobjekt hinzufügen kann ...
                  ... um dann im weiteren Scriptverlauf dieses Unterobjekt zu "überschreiben", ...
                  ... dann wäre ich schon längst dabei!

                  Nun, das Hinzufügen von Eigenschaften ist in PHP (auch 4) kein Problem. Einfach schreibend darauf zugreifen, vorhanden ist die neue Eigenschaft. Mit Funktionen/Methoden sieht es nicht so gut aus, wenn man nicht mit Konstrukten wie call_user_func() zum Aufrufen arbeiten will.

                  Aber das was du mit Javascript on-the-fly machst, hatte ich auf unter PHP noch nicht als nötig empfunden. Auf der Serverseite geht es quasi drum "nur einen Text zu erzeugen". Die Client-Seite hat durch ihre Interaktivität eine andere Aufgabenstellung. Hier muss man auf Ereignisse reagieren, Teile der Anzeige durch Hinzufügen und Entfernen von Objekten ändern, muss diese geänderten Teile mit Ereignis-Handlern versorgen, usw. usf. Die Notwendigkeit einer solchen Flexibilität sehe ich auf Serverseite nicht wirklich. Und ich bin mir sicher, dass es für (d)eine konkrete Aufgabenstellung auch abseits der Javascript-Möglichkeiten eine akzeptable Lösung gibt, die nicht auf guten Stil verzichten muss.

                  echo "$verabschiedung $name";

      2. Hello,

        nun hat dieser Thread doch noch etwas mystisches.

        Ich habe gerade mal in der php.ini

        register_long_arrays = off

        gesetzt und dann auch das Script

        <?php   ### get_globals.php ###

        echo "<pre>\n";
        print_r($GLOBALS);
        #print_r($_SERVER);
        echo "<pre>\n";

        ?>

        die Antwort

        Array
        (
            [GLOBALS] => Array
         *RECURSION*
            [_POST] => Array
                (
                )

        [_GET] => Array
                (
                )

        [_COOKIE] => Array
                (
                )

        [_FILES] => Array
                (
                )

        )

        erhalten.

        Wenn man nun aber fragt

        <?php   ### get_globals.php ###

        echo "<pre>\n";
        print_r($GLOBALS);
        print_r($_SERVER);
        echo "<pre>\n";

        ?>

        erhält man

        Array
        (
            [GLOBALS] => Array
         *RECURSION*
            [_POST] => Array
                (
                )

        [_GET] => Array
                (
                )

        [_COOKIE] => Array
                (
                )

        [_FILES] => Array
                (
                )

        [_SERVER] => Array
                (
                    [HTTP_ACCEPT] => */*
                    [HTTP_REFERER] => http://testserver/~thomas/php4/Arrays/
                    [HTTP_ACCEPT_LANGUAGE] => de
                    [HTTP_ACCEPT_ENCODING] => gzip, deflate
                    [HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
                    [HTTP_HOST] => testserver
                    [HTTP_CONNECTION] => Keep-Alive
                    [PATH] => /usr/local/bin:/usr/bin:/bin
                    [SERVER_SIGNATURE] => Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch1 mod_perl/2.0.2 Perl/v5.8.8 Server at testserver Port 80

        [SERVER_SOFTWARE] => Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch1 mod_perl/2.0.2 Perl/v5.8.8
                    [SERVER_NAME] => testserver
                    [SERVER_ADDR] => 192.168.101.99
                    [SERVER_PORT] => 80
                    [REMOTE_ADDR] => 192.168.101.114
                    [DOCUMENT_ROOT] => /var/www/
                    [SERVER_ADMIN] => webmaster@localhost
                    [SCRIPT_FILENAME] => /home/thomas/web/php4/Arrays/get_globals.php
                    [REMOTE_PORT] => 2400
                    [GATEWAY_INTERFACE] => CGI/1.1
                    [SERVER_PROTOCOL] => HTTP/1.1
                    [REQUEST_METHOD] => GET
                    [QUERY_STRING] =>
                    [REQUEST_URI] => /~thomas/php4/Arrays/get_globals.php
                    [SCRIPT_NAME] => /~thomas/php4/Arrays/get_globals.php
                    [PHP_SELF] => /~thomas/php4/Arrays/get_globals.php
                    [REQUEST_TIME] => 1176825406
                    [argv] => Array
                        (
                        )

        [argc] => 0
                )

        )
        Array
        (
            [HTTP_ACCEPT] => */*
            [HTTP_REFERER] => http://testserver/~thomas/php4/Arrays/
            [HTTP_ACCEPT_LANGUAGE] => de
            [HTTP_ACCEPT_ENCODING] => gzip, deflate
            [HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
            [HTTP_HOST] => testserver
            [HTTP_CONNECTION] => Keep-Alive
            [PATH] => /usr/local/bin:/usr/bin:/bin
            [SERVER_SIGNATURE] => Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch1 mod_perl/2.0.2 Perl/v5.8.8 Server at testserver Port 80

        [SERVER_SOFTWARE] => Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch1 mod_perl/2.0.2 Perl/v5.8.8
            [SERVER_NAME] => testserver
            [SERVER_ADDR] => 192.168.101.99
            [SERVER_PORT] => 80
            [REMOTE_ADDR] => 192.168.101.114
            [DOCUMENT_ROOT] => /var/www/
            [SERVER_ADMIN] => webmaster@localhost
            [SCRIPT_FILENAME] => /home/thomas/web/php4/Arrays/get_globals.php
            [REMOTE_PORT] => 2400
            [GATEWAY_INTERFACE] => CGI/1.1
            [SERVER_PROTOCOL] => HTTP/1.1
            [REQUEST_METHOD] => GET
            [QUERY_STRING] =>
            [REQUEST_URI] => /~thomas/php4/Arrays/get_globals.php
            [SCRIPT_NAME] => /~thomas/php4/Arrays/get_globals.php
            [PHP_SELF] => /~thomas/php4/Arrays/get_globals.php
            [REQUEST_TIME] => 1176825406
            [argv] => Array
                (
                )

        [argc] => 0
        )

        $_SERVER ist dann im Baum von $GLOBALS plötzlich wieder enthalten.
        Das Ganze kann doch nur ein Bug sein?

        Was sagt Ihr dazu? Ist da schon 'was bekannt?

        PHP-Version ist 5.2.0-8

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. echo $begrüßung;

          Das Ganze kann doch nur ein Bug sein?

          Soweit ich weiß, ist das ein Feature. Ich glaube, ich las mal irgendwo im Vorbeigehen, dass die/einige der $_*-Arrays erst dann angelegt werden, wenn sie wirklich benötigt werden.

          echo "$verabschiedung $name";

          1. Hello,

            Das Ganze kann doch nur ein Bug sein?

            Soweit ich weiß, ist das ein Feature. Ich glaube, ich las mal irgendwo im Vorbeigehen, dass die/einige der $_*-Arrays erst dann angelegt werden, wenn sie wirklich benötigt werden.

            Dann ist es doch wohl ein Bug in den Köpfen der Entwickler, oder?
            Was soll die Redundanz, nachdem ich sich nicht mehr benötige?
            Wenn ich wissen will, welche Daten scriptweit bekannt sind, frage ich $GLOBALS ab

            Außerdem muss $_SERVER ja auch irgendwo gehalten werden, wenn man sowieso darauf zugreifen kann. Wieso blendet man es dann in $GLOABLS aus?

            Wenn die Sprache intransparent wird, und genauso unübersichtlich, wie z.B. VBA, dann wird sie sicherlich bald gekickt werden!

            PHP hat deshalb so gezündet, weil es genauso leicht verständlich und benutzbar aufgebaut war, wie damals dBase. Man musste nur wenige Dinge wissen, und konnte schon mächtige Applikationen erstellen. Je mehr man eindrang, desto spezieller wurde es...

            PHP hat da zwar von Anfang an einige Schwachstellen gehabt, aber ich halte die Sprache für sehr potent, auch noch die nächsten 10 - 20 Jahre zu bestehen. Allerdings nicht, wenn derartige "Gedankensprünge" notwendig sind.

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. echo $begrüßung;

              Außerdem muss $_SERVER ja auch irgendwo gehalten werden, wenn man sowieso darauf zugreifen kann.

              Man muss den Server oder die Umgebung dazu befragen und dann das Array aufbauen. Viele Scripts benötigen diese Information nicht, weswegen ein Erzeugen im Bedarfsfall ausreicht.

              Wenn die Sprache intransparent wird, und genauso unübersichtlich, wie z.B. VBA, dann wird sie sicherlich bald gekickt werden!

              Du kennst die magischen Möglichkeiten von Klassen? Und die Standard PHP Library (SPL) Functions? Findest du solche Features auch intransparent?

              echo "$verabschiedung $name";

  2. Hallo,

    Doch nun muss ich in der Funktion jede Variable als "global" aufrufen, was wiederum zu Fehlern führt, wenn eine dazugekommene Variable dort nicht nachgepflegt wird.

    Ich möchte in diese Funktion sämtliche Variablen benutzen und verändern. Wie geht das?

    Du kannst das Superglobale Array „GLOBAL“ verwenden.

    z.B.

      
    $foo = "Hallo";  
    function bar(){  
     echo $GLOBALS['foo'];  
    }  
    bar();  
    
    

    mfg. Daniel

    1. Hallo,

      Du kannst das Superglobale Array „GLOBAL“ verwenden.

      z.B.

      $foo = "Hallo";
      function bar(){
      echo $GLOBALS['foo'];
      }
      bar();

        
      Also setze ich hinter das $ jeder Variable "GLOBALS['" und hinter die Variable noch "']". Mal sehen ...  
        
        $display[] = array(  
      wird zu  
        $GLOBALS['display[]'] = array(  
        
      Hmm, Fehlermeldung keine, aber angelegt wird das neue Sub-Array nicht, auch nicht mit Doppeltüddelchen:  
        
        $GLOBALS["display[]"] = array(  
        
        
        
      Kalle
      
      1. so funzt es:

        $GLOBALS["display"][] = array(

        Danke.

        1. Hello,

          so funzt es:   *pfui*

          $GLOBALS["display"][] = array(

          Aber nicht einfach in $GLOABLS etwas hineinschreiben!
          Du solltest Dir darüber klar werden, was da schon alles drinsteht und was Du anrichten kannst, wenn Du einen Zweig einfach überschreiben würdest, insbesondere dann, wenn Du auch fremden Code einbindest, der zwar vertrauenswürdig ist, aber vielleicht auf die Daten im Array angewiesen ist.

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

      2. Hallo,

        Also setze ich hinter das $ jeder Variable "GLOBALS['" und hinter die Variable noch "']".

        Ist zwar im Prinzip richtig. aber ich würde es anders betrachten:

        Die globalen Variablen wurden in ein Superglobales assoziatives Array gespeichert, in dem die Namen als Index verwendet werden.

        Mal sehen ...

        $display[] = array(
        wird zu
          $GLOBALS['display[]'] = array(

        Vielleicht eher so:

        $GLOBALS['display'][] = array(

        mfg. Daniel

  3. Hello Kalle,

    ich versteh zwar im Großen und Ganzen nur "Bahnhof" bei deinem Posting, denn ich kann nicht erkennen, worüber Du uns ins Bild setzen willst, wo Dein Problem liegt und was Du schon versucht hast, es zu lösen.

    Doch halt: ein paar Vokabeln fallen da und weil ich die letzten Tage mal mit Sven über eine ähnliche Sache diskutiert habe (ansatzweise), kann ich mir denken, was Du willst.

    Du möchtest eine Funktion haben, die Du ständig verbessern kannst, und die dann ständig mehr kann, ohne dass sie die Stellen im Script oder Projekt, die schon älter sind und die von den neuen Errungenschaften noch nichts wussten, zu vernachlässigen?

    Dieses Konzwpt liegt dem DLL-Konzept oder dem der LOAD-Module zugrunde.
    Man arbeitet über Indices, wenn man genau weiß, dass die beiden teile zusammenpassen (das ist schneller) oder man arbeitet über Namen. Die müssen natüelich gepflegt werden und dürfen sich nicht widersprechen.

    function ich_wachse_noch($_daten, $_aufgabe)
      {
        if (is_array($_daten))
        {

    }

    if (is_array($_aufgabe))
        {

    }

    return $fehlercode;   ### 0 entspricht keinem Fehler...

    }

    Das nur als Andeutung.
    Du kannst dann in die Arrays beliebig viele Informationen zusätzlich einhängen.
    Die Funktion prüft intern, ob sie mit jedem Eintrag etwas anfangen kann. Wenn nicht, dann bricht sie mit einem Fehlerwert ab.
    Wenn sie allerdings weniger Arrayelemente erhält, als sie "schlau" ist, dann bearbeitet sie eben den übergebenen Teil.

    Ich hoffe, Du konntest mir folgen ;-)

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau