OOP $this Fehler

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

  • OOP $this Fehler

    Hi,

    Kann mir vielleicht jemand sagen was ich falsch mache ich finde echt keinen Fehler... Der Code ist in PHP5 geschrieben d ich gerade an einem Framework arbeite und auf die PHP5 Features nicht verzichten möchte.

    PHP-Code:
    class Klasse1
    {
      public function 
    __construct($string)
      {
         echo 
    $string;
      }
    }

    class 
    Klasse2 extends Klasse1
    {
      protected 
    $string "String aus Klasse2";

      public function 
    load()
      {
         return 
    $this->string;
      }
    }

    //----------------------------------------------

    new Klasse1(Klasse2::load()); 
    Das sollte einfach nur der $string ausgegeben werden aber stattdessen bekommt man folgenden Fehler:

    Fatal error: Using $this when not in object context in (file) on line (line)

  • #2
    Hi,

    Was genau macht denn $this, und was bedeutet Klasse::Methode? Denk drüber nach und vielleicht kommst du auf den Fehler

    Gruß Thomas

    Kommentar


    • #3
      Also meines wissens nach bedeutet:

      $this, dass die methode oder variable die damit aufgerufen wird innerhalb derjenigen Klasse steht. Und das ist bei dem Beispiel auch erfüllt.

      Dann wird es wohl ein Problem mit dem Klasse::Methode geben :-) Wahrscheinlich weil ich die Methode aus einer anderen Klasse heraus aufrufe. Darf man in PHP nicht aus der Elternklasse heraus Methoden der Kindklasse aufrufen? Andersherum weiß ich das es geht mit parent::methode.

      Wenn ich die Methode aber als static wähle, bedeutet das ja, dass ich nicht extra ein Objekt der Klasse erzeugen muss. Gleich mal probieren ob das mit static funktioniert.

      Wunder mich gerade nur ein bisschen ich hab diese Verfahren nämlich in Zend Framework gelesen, da führt das zwar auch zu einem Fatal Error, aber ich dachte die Leute da habens drauf^^

      Kommentar


      • #4
        Deine Erklärung zu $this ist nicht ganz korrekt. $this bezieht sich auf das aktuelle objekt. Da du aber statisch eine Methode der zweiten Klasse aufrufst, zeigt $this auf kein konkretes Objekt und verweist damit ins Nirvana.

        Kommentar


        • #5
          Hi,

          Du musst ein Objekt der Klasse Klasse2 instanziieren und kannst dann die Methode load() dieser Instanz verwenden. Die Fehlermeldung sagts doch eigentlich ganz deutlich.

          LG

          Kommentar


          • #6
            Ok, so hatte ichs vorher auch gemacht gehabt war nur ein bisschen iritiert da es beim Zend Framework bei der Klasse Config so gemacht wurde wie ich es oben probiert habe...

            Danke, jetzt weiß ich zumindest genau wo der Fehler liegt :-)

            Kommentar


            • #7
              Original geschrieben von PHP-Checker
              Ok, so hatte ichs vorher auch gemacht gehabt war nur ein bisschen iritiert da es beim Zend Framework bei der Klasse Config so gemacht wurde wie ich es oben probiert habe...
              eh ... ich hab zwar schon lange kein Auge mehr auf das Framework geworfen, aber zumindest zu Anfang konnten die Leute vor allem das eine: Validen PHP-Code produzieren, deshalb hat ja auch nur eine beschränkte Anzahl User Schreibzugriff auf's SVN
              Das die in einer statischen Methode mit $this rumhantieren, wage ich wirklich zu bezweifeln

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

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

              Kommentar


              • #8
                http://framework.zend.com

                Lad dir einfach die Download Version runter und schau dir die Config.php und die Config/Ini.php an ich hab in den beiden Dateien schon einige Fehler entdeckt....

                Ini.php

                Es wird ein Ini File eingelesen und im IniArray abgelegt. So danach überprüfen sie ob eine Sektion im Array doppelt vorkommt. Ziemlich sinnlos da falls eine Sektion im Ini File doppelt vorkommt die parse_ini_file Funktion den vorherigen wert überschreibt so dass die Sektion nur einmal im Array steht.

                Laut der Dokumention wird ein Ini File so geladen:
                PHP-Code:
                $config = new Zend_Config(Zend_Config_Ini::load('config.ini')); 
                Nur blöd das die Funktion load() überhaupt nicht existiert da diese fälschlicherweise als __construct() definiert wurde. Selbst wenn man das ganze in load umbenennt geht es nicht da eben wie oben erläutert ziemlich viele $this vorkommen und diese Methode ist auch nicht als static ausgezeichnet.

                Kannst dich ja selbst überzeugen...
                Zuletzt geändert von PHP-Checker; 25.11.2006, 20:30.

                Kommentar


                • #9
                  Original geschrieben von PHP-Checker
                  Laut der Dokumention wird ein Ini File so geladen:
                  PHP-Code:
                  $config = new Zend_Config(Zend_Config_Ini::load('config.ini')); 
                  Regel Nummer 1:
                  Eine Doku ist NIE so aktuell wie der Quellcode ^^

                  Ich überfliege gerade nur, aber ich schätze die haben einfach die Anwendungsweise geändert (es ist ja schlichtweg noch eine Alpha-Preview) und das wurde noch nicht in der Dokumentation geändert

                  Wenn ich mir die Vererbung so anschaue, würde ich auf eine Verwendung wie
                  PHP-Code:
                  $config = new Zend_Config_Ini('config.ini'); 
                  tippen, da Zend_Config_Ini von Zend_Config erbt

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

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

                  Kommentar


                  • #10
                    Ja die werden da noch einiges ändern, ich schreib mir nur gerade selbst mein erstes Framework und ich hab halt ein Beispiel gebraucht um zu sehen wie das aufgebaut wird :-)

                    Kommentar

                    Lädt...
                    X