[PHP5] merkwürdiges $GLOBALS-Verhalten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [PHP5] merkwürdiges $GLOBALS-Verhalten

    Hi Leute

    folgendes Problem:
    In meinem CMS verwende ich eine Kernklasse, die die Konfiguration etc. vornimmt. Beim Initialisieren der Klasse lege ich unter der Variablen $me im globalen Bereich das aktuelle Userprofil ab, so dass von überall Zugriff besteht.
    Der Kern wird über eine Datei core.inc.php eingerichtet, welche in alle Dateien includiert wird.
    Das Problem ist jetzt, das bei mir lokal alles bestens läuft und auf meinem Webspace lief bis vor einem Monat auch alles super. Ich weiß nicht genau, aber ich glaube, die Hoster sind von PHP 5.1.X auf 5.2.2 gegangen. Lokal läuft 5.1.1. Und nun macht folgende Zeile auf dem Webspace Probleme:
    PHP-Code:
    $GLOBALS['me'] = new Userprofil$_SESSION['user'] ); 
    Macht Probleme heißt, es kommt keine Ausgabe an den Client. Also, selbst wenn ich vor dieser Zeile einige echos einfüge, sehe ich nur eine weiße Seite. Sobald ich die Zeile auskommentiere, funktioniert alles wieder (bis irgendwann auf die nichtdefinierte Variable $GLOBALS['me'] zugegriffen wird).
    Ich habe schon versucht, woran das Problem liegen könnte, jedoch keine Lösung gefunden.
    Ich kann der Variablen alles mögliche Zuweisen und ich kann auch das Userprofil anlegen und irgend einer anderen Variablen Zuweisen. Auch der Weg, die Variable per
    PHP-Code:
    global $me
    bekannt zu machen und dann zuzuweisen, resultiert in einer weißen Seite. Auch wenn ich das neue Userprofil-Objekt vorerst einer anderen Variablen zuweise und dann der globalen, sehe ich nur Weiß.

    Nach einem Blick in die phpinfo viel mir der Versionsunterschied auf. In den Changelog von php steht bei Version 5.2.0 der Eintrag:
    Code:
    Added automatic module globals management. (Dmitry)
    Meiner Meinung nach wird da das Problem liegen.

    Meine Frage nun, was kann ich da tun? Habt ihr ein paar Ideen, wie ich jetzt vorgehen sollte? Schließlich ist das System so nicht lauffähig!

    Gruss
    Martin

  • #2
    Warum verwendest du auch $GLOBALS?
    Singleton-Pattern und fertig.

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Ja, ich weiß, habe ich auch schon mehrmals drüber nachgedacht. Da aber mehrere Userprofile existieren können, halte ich dies für nicht ganz passend.
      Außerdem löst dies nicht das Problem! Aber trotzdem schonmal danke!

      Kommentar


      • #4
        Original geschrieben von PHP-Desaster
        Ja, ich weiß, habe ich auch schon mehrmals drüber nachgedacht. Da aber mehrere Userprofile existieren können, halte ich dies für nicht ganz passend.
        Dann fehlt dir scheinbar die Kreativität...
        PHP-Code:
        $user1 userprofil::get_profil_by_id(1);
        $user2 userprofil::get_profil_by_id(2); 
        Das ganze lässt sich per static property und method ganz leicht umsetzen.

        Außerdem löst dies nicht das Problem! Aber trotzdem schonmal danke!
        Wenn es wirklich ein Bug in PHP ist (worauf eine weiße Seite für gewöhnlich schließen lässt, sofern display_errors=on und error_reporting=E_ALL ist; denn dann findet sich meist ein segfault im apache-error-Log wieder), kannst du da sowieso nichts dran ändern.

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Ich denke, es scheint sich dabei wirklich um einen PHP-Bug zu handeln. Habe jetzt eine static-Variable draus gemacht, also wie ghostgambler bereits meinte, Singleton-Muster!

          Falls doch noch wer eine Lösung mit der $GLOBALS-Variante parat hat, immer her damit

          Kommentar


          • #6
            Kannst du mal einen kurzen Beispiel-Code erstellen mit dem sich das Problem eingrenzen lässt?
            Ich will das bei mir mal ausprobieren...

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              Ich kann dir nicht genau sagen, wo das Problem liegt, aber ich kann es mal versuchen.

              Core.class.php
              PHP-Code:
              <?php
              class Core {
                static public function 
              init() {
                  
              // ...
                  
              if( !isset( $_SESSION['user'] ) ) {
                    
              $_SESSION['user'] = array( 'id'=>0'name'=>'Gast' );
                  }
                  
              $GLOBALS['me'] = new Userprofil$_SESSION['user'] );
                  
              // ...
                
              }
              }
              ?>
              Userprofil.class.php
              PHP-Code:
              <?php
              class Userprofil extends ArrayObject {
                public function 
              __construct$args ) {
                  
              // ...
                
              }
              }
              ?>
              core.inc.php
              PHP-Code:
              <?php
                
              // ...
                
              include "Userprofil.class.php";
                include 
              "Core.class.php";
                
              Core::init();
                
              // ...
              ?>
              index.php
              PHP-Code:
              <?php
                
              include "core.inc.php";
                
              // ...
                // Zugriff auf Userprofil
                
              var_dump$GLOBALS['me'] );
              ?>

              Habe alles wahrscheinlich unwichtige herausgenommen. Die Struktur des einbindens ist aber so, wie hier im Beispiel, bis auf den Unterschied, dass die Klasse Userprofil per __autoload geladen wird, da kann der Fehler aber nicht liegen, da auch andere Klassen korrekt geladen werden.
              Guck mal, ob das bei dir Korrekt läuft!

              Kommentar


              • #8
                PHP-Code:
                <?php
                class Userprofil extends ArrayObject {
                  public function 
                __construct$args ) {
                    
                // ...
                  
                }
                }


                class 
                Core {
                  static public function 
                init() {
                    
                // ...
                    
                if( !isset( $_SESSION['user'] ) ) {
                      
                $_SESSION['user'] = array( 'id'=>0'name'=>'Gast' );
                    }
                    
                $GLOBALS['me'] = new Userprofil$_SESSION['user'] );
                    
                // ...
                  
                }
                }

                  
                Core::init();


                var_dump$GLOBALS['me'] );
                Code:
                F:\Dokumente und Einstellungen\GhostGambler\Desktop\php-5.2.2-Win32>php-cgi.exe test.php
                X-Powered-By: PHP/5.2.2
                Content-type: text/html
                
                object(Userprofil)#1 (0) {
                }
                funktioniert demnach bei mir ... bei dir nicht?
                Ansonsten stell bitte mal ein vernünftigen Test-Case zusammen, d.h. Code der bei dir nicht geht, den ich kopieren und einfügen kann und bei mir ausprobieren kann.

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar


                • #9
                  Das Problem muss doch wo anders liegen. Ich bin immer noch auf der Suche, will aber nicht die ganzen Skripte posten.
                  Also -> *Thread erstmal auf Eis leg*

                  Kommentar

                  Lädt...
                  X