[OOP] Reihenfolge der Initialisierung wichtig ??

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

  • [OOP] Reihenfolge der Initialisierung wichtig ??

    HI !

    Hab seit nun fast ner Woche ein blödes Problem. Dank Design und Modul System zusammen mit OOP funzt alles irgendwie net so richtig.
    Der anchfolgende Code scheint etwas sinnlos, aber das ist der Grundaufbau meines Systems. Klappte bisher auch ganz gut, bis ich dann Variablen in den Modulen mit Werten belegt hatte, denn diese wurden nicht durch die Templatefunktion ausgegeben. Langsam weiß ich net was dadran falsch sein könnte, find einfach nix. Kann mir das nur so erklären, dass PHP damit Probleme hat, dass die Klassen Variablen aus der jeweiligen anderen verwenden, also die eine Klasse variablen aus einer Klasse, die "noch" garnet existiert sondern erst später initialisiert wird. Abetr wie ich das umgehen könnte wäre dann die nächste Frage. Naja, vielleicht findet ja jemand was

    PHP-Code:
    <?php
    class Template {
        function 
    templatemain() {
            global 
    $Content$TestText;
            echo 
    $TestText;
            echo 
    $Content->text;
        }
    }

    class 
    Inhalt {
        var 
    $text;
        function 
    Inhalt () {
            global 
    $Tpl;
            
    $this->text "<br />Ich bin der weitere Inhalt und müsste zweimal hier stehen";
            
    $Tpl->templatemain();
        }
    }

    $TestText "Ich bin der erste Inhalt";
    $Tpl   = new Template;
    $Content = new Inhalt;


    echo 
    "<br />>>".$Content->text."<<";
    ?>
    Dank' schön schonmal

    PS: dabei rauskommen sollte:
    Ich bin der erste Inhalt
    <br />Ich bin der weitere Inhalt und müsste zweimal hier stehen
    <br />>><br />Ich bin der weitere Inhalt und müsste zweimal hier stehen<<


    Leider werden nur die Teststrings ausgegeben, nciht aber der aus der eigentlichen Templatefunktion.

  • #2
    Ja das Problem ist das du in der Klasse Template schon $Content benutzt, dieses jedoch noch nicht initialisiert wurde und daher leer ist.
    Dagegen kann man auch eigentlich nix tun (denke ich zumindest)

    Ich wuerde das ueber Parameter-uebergabe loesen:

    PHP-Code:
    class Template {
        function 
    templatemain($text) {
            global 
    $TestText;
            echo 
    $TestText;
            echo 
    $text;
        }
    }

    class 
    Inhalt {
        var 
    $text;
        function 
    Inhalt () {
            global 
    $Tpl;
            
    $this->text "<br />Ich bin der weitere Inhalt und müsste zweimal hier stehen";
            
    $Tpl->templatemain($this->text);
        }

    Kommentar


    • #3
      btw: in klassen würde ich so wenig wie möglich(um nicht zu sagen: gar nicht) global-Konstrukte verwenden (mach das lieber mit referenzen)
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        Parameterübergabe würde z.B. bei einem benutzerprofil sehr viel werden. über 20 Parameterübergebn ist glaube ich auch net das wahre.

        und wie ist das mit den Referenzen gemeint ?

        Kommentar


        • #5
          PHP-Code:
          class Inhalt {
              var 
          $text;
              function 
          Inhalt (&$tpl) {
                  
          $this->text "<br />Ich bin der weitere Inhalt und müsste zweimal hier stehen";
                  
          $tpl->templatemain($this->text);
              }
          }

          $Tpl   = new Template;

          $Content = new Inhalt(&$Tpl); 
          so is das gemeint

          bei dem benutzerprofil sollte doch die id des jeweiligen benutzers ausreichen oder?
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            ich seh da jetzt ehrlich gesagt keinen vorteil drin, hab referenzen ehrlich gesagt auch noch nie verwendet. und nein, die Templatefunktion oder wie auch immer man sie nennen will, gibt ja beinhaltet ja nur im eneffekt den HTML kram und gibt jeweils den fertigen Teil an die Output funktion weiter, die das nachher alles ausgibt. aber die template funktion selber macht ja nix. das variablen definieren geshcieht ja in der modul klasse ... zumindest war es so alles gedacht und funzte auch prima, bis ich dann halt variablen in der modulklasse geändert habe wie gesagt, also würde die ID net reichen

            Kommentar


            • #7
              was willst du in welcher klasse machen?

              bin aus deinem text nich so recht schlau geworden

              EDIT:
              vorteil: wenn du deine variable mal umbenennst, musst du an der klasse, die die referenz verwendet nix ändern, wenn du da mit global $Tpl arbeitest, musst du das überall durch den neuen namen ersetzen (gibt bei klassen sowas wie wiederverwendbarkeit des codes und nach außen hin abgeschlossen )
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Also ich habe (bin dabei, ja ich weiß , ein weiteres CMS zu basteln):

                Ne Modul-Klasse (diese liest daten aus DB aus, verarbeitet infos usw.
                Diese ruft dann wenn sie meinetwegen - nehm wir mal ein forum als beispiel - ne reihe fertig ausgelesen hat (grob gesagt) die $Tpl->forumzeile(); auf.
                Die Template Klasse sollte mit der gerade geladen template Datei (mit HTML und Ausgabe durch <EOF >>) die aktuellen variablen der Modul-Klasse verwerden. Dann gibt die Template Klasse das "geparste" weiter an die Output Klasse, die die komplette Seite nach und anch in sich spiechert und am ende ausgibt.

                also
                Modul
                -> Template
                -> -> Output
                Modul
                -> Template
                -> -> Output
                Output ALL

                Edit: und dadraus bin ich net schlau geworden wieso muss ich was nicht umbenennen ? wenn ich ne referenz auf $tpl habe und tpl umbenenne funzt die Referenz doch auch net mehr, versteh ich net. einziger vorteil den ich von referenzen weiß, ist, dass die variable nicht wiklich geändert wird.
                Zuletzt geändert von Hatachy; 29.06.2003, 21:10.

                Kommentar


                • #9
                  die referenz übergibst du einmal beim initialisieren und speicherst sie dann in der klasse als variable

                  wenn du jetzt den namen änderst, musst du das nur beim initialisieren ändern und sonst nirgends
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Nach folgender Modification
                    PHP-Code:
                    <?php
                    class Template {
                        function 
                    templatemain() {
                            global 
                    $Content$TestText;
                            echo 
                    "<br> TEpmlatemain Testtext:".$TestText;
                            echo 
                    "<br> TEpmlatemain Content:".$Content->text;        
                        }
                    }

                    class 
                    Inhalt {
                        var 
                    $text;
                        function 
                    Inhalt () {        
                            
                    $this->text " Ich bin der weitere Inhalt und müsste zweimal hier stehen";

                        }
                        function 
                    doit()
                        {
                            global 
                    $Tpl;
                             
                    $Tpl->templatemain();
                        }
                    }

                    $TestText "Ich bin der erste Inhalt";
                    $Tpl   = new Template;
                    $Content = new Inhalt;
                    $Content->doit();



                    echo 
                    "<br />>>Letztez content:".$Content->text."<<";
                    ?>
                    wird das gewünschte erzielt.
                    Meine Vermutung ist, das bei deiner Version
                    PHP-Code:
                    function Inhalt () {
                            global 
                    $Tpl;
                            
                    $this->text "<br />Ich bin der weitere Inhalt und müsste zweimal hier stehen";
                            
                    $Tpl->templatemain();
                        } 
                    $Tpl->templatemain, im Construktor von der Klasse Inhalt, und somit von der Variable Content aufgerufen wird, da der Konstruktor aber zum Aufruf zeitpunkt noch nicht beendet ist, existiert die Variable / das Objekt Content auch noch nicht so richtig

                    Folgender Code modifiezierung mit var_dump, unterstreicht meine Vermutung.
                    PHP-Code:
                    <?php
                    class Template {
                        function 
                    templatemain() {
                            global 
                    $Content$TestText;
                            
                    var_dump($Content);
                            echo 
                    "<br> TEpmlatemain Testtext:".$TestText;
                            echo 
                    "<br> TEpmlatemain Content:".$Content->text;        
                        }
                    }

                    class 
                    Inhalt {
                        var 
                    $text;
                        function 
                    Inhalt () {        
                        global 
                    $Tpl;
                            
                    $this->text " Ich bin der weitere Inhalt und müsste zweimal hier stehen";
                             
                    $Tpl->templatemain();
                             echo 
                    "<br><br>";

                        }
                        function 
                    doit()
                        {
                            global 
                    $Tpl;
                            
                    $Tpl->templatemain();
                            
                        }
                    }

                    $TestText "Ich bin der erste Inhalt";
                    $Tpl   = new Template;
                    $Content = new Inhalt;
                    $Content->doit();



                    echo 
                    "<br />>>Letztez content:".$Content->text."<<";
                    ?>
                    Ergebnis:
                    PHP-Code:
                    NULL 
                    TEpmlatemain Testtext
                    :Ich bin der erste Inhalt
                    TEpmlatemain Content
                    :

                    object(inhalt)(1) { ["text"]=> string(58" Ich bin der weitere Inhalt und müsste zweimal hier stehen" 
                    TEpmlatemain Testtext:Ich bin der erste Inhalt
                    TEpmlatemain Content
                    Ich bin der weitere Inhalt und müsste zweimal hier stehen
                    >>Letztez contentIch bin der weitere Inhalt und müsste zweimal hier stehen<< 
                    aja guten morgen allerseits



                    rth
                    H I L F E
                    GD FreeType Antialising
                    Gesuch PHP Entwicklungsumgebung
                    ------------------------------------------
                    Der Cmabrigde rael tset, sruf whoin du wlilst

                    Kommentar


                    • #11
                      warum macht OOP einem das bloß immer so schwer

                      Danke vielmals

                      Kommentar

                      Lädt...
                      X