Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit Interface-Beispiel - liegts an der Uhrzeit?

Einklappen

Neue Werbung 2019

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

  • Problem mit Interface-Beispiel - liegts an der Uhrzeit?

    Hilfe,

    ich habe folgendes einfaches Beispiel. Vielleicht bin ich schon etwas matschig wegen der Zeit, sicher ist der Fehler offensichtlich, aber ich komme gerade einfach nicht drauf.

    Ich habe folgendes Interface und eine Klasse dazu:
    PHP-Code:
    interface iTemplate
    {
        public function 
    setWas($name);
    }


    class 
    Template implements iTemplate
    {
      
        public function 
    setWas($name)
        {
            echo 
    $name;
        }
      

    Soweit so gut, erschaffe ich mir jetzt ein Objekt, von der Klasse Template, dann knallt es:

    PHP-Code:
    $test = new Template(); 
    Fehlermeldung:
    Fatal error: Class 'Template' not found in C:\Users\NetBeansProjects\PhpProject1\index.php on line 3
    PHP Fatal error: Class 'Template' not found in C:\Users\NetBeansProjects\PhpProject1\index.php on line 3

    Zeile drei ist die Instanziierung.
    Streiche ich aus der Klasse das "implements iTemplate" dann läuft alles.

    Sagt mir wo ich die Tomaten auf den Augen habe! Bitte!



  • #2
    Befinden sich alle Definitionen in einer Datei? Falls nicht, hast du sichergestellt, das alle benötigten Dateien in der richtigen Ordnung eingebunden werden (z.B. durch autoloading oder manuelle includes)?

    Kommentar


    • #3
      Zitat von Suralc Beitrag anzeigen
      Befinden sich alle Definitionen in einer Datei? ...
      Ja, ich habe momentan alles in einer einzigen Datei um solche Fehlerquellen auszuschließen. DA ist alles.

      Sicher ist nur eine doofe Kleinigkeit falsch, die ich übersehen habe?

      Viele Grüße

      Kommentar


      • #4
        Kann so falsch nicht sein. Da ich so keinen Fehler entdecken konnte, habe ich das mal 1:1 kopiert und bei mir funktioniert es so wie gewollt.
        Ich rate mal ins Blaue, da ich mir nicht sicher bin: Welche PHP-Version hast Du? Interfaces sind imho zwar ab irgendeiner 5er in den New Object Model enthalten, aber ab welcher Version genau weiß ich grad nicht.

        Kommentar


        • #5
          Zitat von Arne Drews Beitrag anzeigen
          Kann so falsch nicht sein. Da ich so keinen Fehler entdecken konnte, habe ich das mal 1:1 kopiert und bei mir funktioniert es so wie gewollt.
          Ich rate mal ins Blaue, da ich mir nicht sicher bin: Welche PHP-Version hast Du? Interfaces sind imho zwar ab irgendeiner 5er in den New Object Model enthalten, aber ab welcher Version genau weiß ich grad nicht.
          Danke für Deine Mühe,

          es ist eine Version 5.6. Ich hatte schon Netbeans im Verdacht, aber von der Kommandozeile aus war es das gleiche Problem.

          Ich teste es mal auf einem anderen Rechner mit der aktuellen 5.6.7, und melde mich gleich noch mal - denn erklären kann ich mir das auch nicht.

          Kommentar


          • #6
            So, hallo noch mal.

            Mit der aktuellen 5.6.7, ohne Netbeans genau der gleiche Fehler.

            Ich habe aber festgestellt, dass hier (Klassendefinition ganz am Anfang!!???!?!!!) geht:

            PHP-Code:
            <?php
            class Template implements iTemplate
            {
              
                public function 
            setWas($name)
                {
                    echo 
            $name;
                }
              
            }

            $test = new Template();
            $test->setWas("hallo");

            interface 
            iTemplate
            {
                public function 
            setWas($name);
            }
            Aber das hier (Klassendefinition unter dem Aufruf) führt zu dem beschriebenen Fehler:

            PHP-Code:
            $test = new Template();
            $test->setWas("hallo");


            interface 
            iTemplate
            {
                public function 
            setWas($name);
            }


            class 
            Template implements iTemplate
            {
              
                public function 
            setWas($name)
                {
                    echo 
            $name;
                }
              



            Kann das mal jemand verifizieren oder mir sagen wo ich sonst einen so kapitalen Bock verursache?
            Wenn ich das "implements" herausnehme funktioniert es übrigens in allen Varianten!

            Kommentar


            • #7
              Also 5.6 reicht locker. Hatte es nur in Verdacht evtl. bei 5.0.x
              Aber bei 5.6+ sollte das nicht der Grund sein!

              Das Verhalten ist kurios, denn Dein Code aus #1 läuft bei mir wie gesagt 1:1 sauber durch.
              Sorry, bin da dann auch ratlos, wenn ich das nicht nachstellen kann...

              Kommentar


              • #8
                php.net sagt dazu offiziell (das scheint die Lösung zu sein):

                "Wenn Autoloading nicht verwendet wird, so müssen die Klassen definiert werden bevor sie verwendet werden. Wenn eine Klasse eine andere erweitert, so muss die Vaterklasse vor der Kindklasse deklariert werden. Diese Regel gilt für Klassen, die von anderen Klassen und Interfaces erben."

                Also ich hatte nie Probleme wenn Klassendefinitionen am Ende des Codes standen. Anscheinend ist der letzte Satz entscheidend, dass das für Klassen gilt die erben.

                Kam anscheinend sonst immer in diesem Fällen so hin bei mir und das war die erste Ausnahme.

                Seltsam? Aber so steht es geschrieben...

                Kommentar


                • #9
                  Es wäre sowieso ratsam pro Datei nur eine Klasse/Interface zu deklarieren und ein Autoloading einzusetzen. Das sind einfach Probleme mit denen man sich als Programmierer nicht herumschlagen möchte mMn

                  Kommentar


                  • #10
                    Aber das hier (Klassendefinition unter dem Aufruf) führt zu dem beschriebenen Fehler:
                    erwartest du etwas anderes? du kannst nichts benutzen, was du noch nicht definiert hast.

                    Kommentar


                    • #11
                      Aus Deinem ersten Post entnehme ich nicht, daß Du die Instanziierung VOR der Definition ausführst!

                      Kommentar


                      • #12
                        Zitat von Dormilich Beitrag anzeigen
                        erwartest du etwas anderes? du kannst nichts benutzen, was du noch nicht definiert hast.
                        Ehrlich gesagt, mir ist (bis) auf das obige Zitat gar nichts bekannt, dass alles definiert werden muss (von der Reihenfolge im Quelltext gesehen) bevor es verwendet wird? Funktionen können ja auch am Ende des Quelltextes stehen - zumindest funktioniert das
                        Gibt es da etwas in der Dokumentation dazu?

                        Auch im obigen funktionierenden Beispiel ist das Interface ganz am Ende definiert und das klappt ja.
                        Das Problem ist offensichtlich (und das deckt sich ja mit dem Text aus php.net), dass die Klasse die das Interface implementiert am Anfang stehen muss: Zitat "Diese Regel gilt für Klassen, die von anderen Klassen und Interfaces erben."

                        Seltsam ist das schon etwas.

                        Kommentar


                        • #13
                          Zitat von Arne Drews Beitrag anzeigen
                          Aus Deinem ersten Post entnehme ich nicht, daß Du die Instanziierung VOR der Definition ausführst!
                          Mein Fehler, weil das bei normalen Klassen keinerlei Problem ist und ich sonst die Instanziierung selbst auch meistens nach der Definition mache, schien mir das gar nicht relevant.

                          Kommentar


                          • #14
                            Kein Problem, daher ist es halt nur wichtig, daß Du Code immer so postest, wie er wirklich bei Dir steht.
                            Dann hätte man da vermutlich direkt helfen können...

                            Kommentar

                            Lädt...
                            X