Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Fehlermeldung deuten ,- inkompatiblität

Einklappen

Neue Werbung 2019

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

  • PHP Fehlermeldung deuten ,- inkompatiblität

    Grüß euch,

    ich habe mit meinem Forum ein kleines Problem, wenn ich es von PHP 5.3 auf 5.5 umstellen will. Da ich noch umschalten kann ist das ein Problem, welches ich doch mal in nächster Zeit lösen müßte eh ich nur noch PHP 5.5 oder 5.6 nutzen kann.

    Ein Plugin wirft mit PHP 5.5 den Fehler:
    (213): Non-static method RGallerySystem::getCurrentCategorie() should
    not be called statically, assuming $this from incompatible context
    Heißt ja auf Deutsch, dass die nicht statische Methode getCurrentCategorie nicht als statische aufgerufen werden solle, mit der Ausnahme vom $this aus dem inkompatiblen Kontext .

    da ich immer noch nicht ganz fit bin im PHP muß ich doch mal nachhaken, was ich mir da mal anschauen muß.

    Vielen Dank für eure Tips.


  • #2
    Hast du dir mal die beiden Zeilen angeschaut? Also die Zeile, in der der Fehler auftritt und die, in der die Methode definiert ist?
    mysql ist veraltet Mails senden: Ohne Probleme und ohne mail()
    PHP-Code:
    echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>'

    Kommentar


    • #3
      Meinst du jetzt in der Datei oder die Fehlerspur? Die wäre hier:
      Stacktrace:
      #0 /web/1/000/020/033/35784/htdocs/wbb/lib/page/RGalleryPage.class.php(213): WCF::handleError(2048, 'Non-static meth...', '/web/1/000/020/...', 213, Array)
      #1 /web/1/000/020/033/35784/htdocs/wbb/wcf/lib/page/AbstractPage.class.php(46): RGalleryPage->show()
      #2 /web/1/000/020/033/35784/htdocs/wbb/wcf/lib/util/RequestHandler.class.php(64): AbstractPage->__construct()

      Weiter unten steht auch noch die Datei:
      Information:
      error message: PHP error in file
      /web/1/000/020/033/35784/htdocs/wbb/lib/page/RGalleryPage.class.php
      (213): Non-static method RGallerySystem::getCurrentCategorie() should
      not be called statically, assuming $this from incompatible context

      In der Datei selber wird es an diesen beiden Stellen aufgerufen:
      Code:
      		$cat = $gallery->getCurrentCategorie();
      		$tag = $gallery->getCurrentTag();
      		if ($cat) {
      			if (isset($getCats[$cat]['catName']))
      				$current_cat = $getCats[$cat]['catName']; else {
      				WCF::getSession()->unregister('pub_cat');
      				$current_cat = '';
      			}
      		} else
      			$current_cat = '';
      		WCF::getTPL()->assign('current_cat', $current_cat);
      		$tagCloud = $gallery->generateTagCloud(false, 'RGallery');
      		if (!isset($_GET['rGalleryPage']))
      			$_GET['rGalleryPage'] = 1; else {
      			if (!is_numeric($_GET['rGalleryPage']))
      				$_GET['rGalleryPage'] = 1;
      		}
      		WCF::getTPL()->assign('RGalleryCats', $getCats);
      		WCF::getTPL()->assign('RGalleryCats_value', $RGalleryCats_value);
      		WCF::getTPL()->assign('RGalleryCats_name', $RGalleryCats_name);
      		WCF::getTPL()->assign('RGalleryCats_items', $RGalleryCats_items);
      		WCF::getTPL()->assign('rGalleryCat', RGalleryItem::getCurrentCategorie());

      Kommentar


      • #4
        DoppelterDoppelPunkt

        Achtung halb Wissen:
        Ich hab da noch nicht soviel mit gearbeitet, aber der doppelteDoppelpunkt gibt dir zugriff auf statische Methoden oder Konstanten, soweit ich weiß.
        Somit sagt mir die Fehlermeldung, achtung du versucht über diese Notation auf eine nicht statische Methode zuzugreifen.
        Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

        Kommentar


        • #5
          Das ist relativ simpel:

          Nicht-statische Klassenfunktionen haben Zugriff auf das aktuelle Objekt über $this.
          Bei statischer Bindung gibt es aber kein Objekt und somit kein $this! Funktionen werden nicht im Kontext des Objekts, sondern im Kontext der Klasse aufgerufen. Der Versuch, in einer statischen Methode auf $this zuzugreifen, wird einen Fehler erzeugen.
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            lstegelitz, danke für die Erklärung , aber ich kann dir mit meinem Wissen noch nicht ganz folgen.
            $this wird in der ganzen Datei gar nicht genommen, wie kommt es daher zum Fehler?

            Kommentar


            • #7
              Zitat von flexxer Beitrag anzeigen
              lstegelitz, danke für die Erklärung , aber ich kann dir mit meinem Wissen noch nicht ganz folgen.
              $this wird in der ganzen Datei gar nicht genommen, wie kommt es daher zum Fehler?
              PHP-Code:
              class whatEver
              {
              public function 
              foo()
              {
              }

              public static function 
              bar()
              {
              }

              Der Zugriff ist wie folgt:
              PHP-Code:
              $oWhatever = new whatEver();
              $oWhatever->foo();
              whatEver::bar(); 

              @edit: Für den Zugriff muss natürlich das File wo die Klasse drin ist includiert werden, aber das ist ja offensichtlich nicht dein Fehler

              $this ist innerhalb der jeweiligen Klasse sozusagen stellvertretend für deine Objekt variable.
              Bei dir heißt hier das $this => $gallery
              Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

              Kommentar


              • #8
                PHP stellt das automatisch fest.

                Wenn das Schlüsselwort "static" bei der Funktionsdeklaration fehlt, dann ist dies eine nicht-statische Methode.
                Der Aufruf dieser Methode im statischen Kontext (also Classname::Method()) ist dann nicht erlaubt.

                Es geht darum, ob innerhalb der (statisch aufgerufenen) Methode $this verwendet wird.
                Beispiel:
                PHP-Code:
                class foo {
                    protected 
                $baz// nicht-statische Membervariabel
                    
                function bar() { // nicht-statische Memberfunktion
                        
                $this->baz 'foo:bar'// Zugriff auf $this!
                    
                }
                }

                foo::bar(); // BÄM 
                Sobald dieser Code ausgeführt wird, knallt es. Der Grund: Die Funktion bar() wird ohne Objekt aufgerufen. Ohne ein Objekt existiert $this innerhalb von bar() nicht, ein Zugriff darauf ist wie der Versuch, auf "null" zu schreiben.

                Umgekehrt wäre der nicht-statische Aufruf einer statischen Funktion kein Problem... warum das so, müsstest du dir nun selber erklären können.
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Ok, so langsam dämmert es am Horizont,- noch nicht freie Sicht, wird aber besser. hatte nebenbei mir nochmal durchgelesen, wie im PHP die statischen Methoden angelegt und aufgerufen werden und mit den beiden Beispielen wird es besser.


                  lstegelitz, um bei deinem Beispiel zu bleiben, es wäre gut ausgegangen in deinem Bsp., wenn du gesagt die Funktion statisch gesetzt hättest, -also "static function bar()" , richtig?



                  Das würde als Lösungsweg für mein Problem bedeuten:
                  Ich muß in einer der inkludierten Dateien schauen, wo denn nun die Funktion "getCurrentCategorie()" erstellt wurde. In Normalfall sollte sie ja statisch sein können. Also muss ich schauen wo sie dann nun drin ist und ihr dort "static getCurrentCategorie()" vorsetzen, richtig?

                  Und das war wohl eine Sache, die die PHP Version als Fehler korrigierte, es aber in neueren Versionen strikter läuft?

                  Kommentar


                  • #10
                    lstegelitz, um bei deinem Beispiel zu bleiben, es wäre gut ausgegangen in deinem Bsp., wenn du gesagt die Funktion statisch gesetzt hättest, -also "static function bar()" , richtig?
                    Nur formell... inhaltlich steckt das Problem IN der Funktion bar(), denn dort wird $this benutzt.

                    Nochmal:
                    Du hast eine Klassenfunktion, die $this benutzt.
                    Rufst du diese im Kontext der Klasse auf (also Klassenname::Methode()) dann ist $this unbekannt. Ein Versuch, über $this weitere Funktionen oder Variablen anzusprechen, endet in einem Speicherzugriffsfehler. Das ist alles.

                    Du musst dir nur klarmachen, was $this ist
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      Da im Codesnippet bereits

                      PHP-Code:
                      $cat $gallery->getCurrentCategorie(); 
                      enthalten ist, sollte es reichen wenn du RGalleryItem::getCurrentCategorie() durch $gallery->getCurrentCategorie() ersetzt. Ggf. ist es möglich RGalleryItem::getCurrentCategorie() durch $cat zu ersetzen, wenn das Ergebnis von getCurrentCategorie() nicht durch den Ablauf des vorherigen Scripts verändert wird.

                      Kommentar


                      • #12
                        Ah ich glaube das war die Lösung. Ich muß jetzt mal durch alle Templates durch und mal schauen wo soetwas drin ist und das gegen $gallery->getCurrentCategorie tauschen.

                        Erstmal besten dank bis hierher.

                        Kommentar


                        • #13
                          Verdammt, jetzt kommt das mit dem statischen doch zum tragen.

                          Tausche ich es in manchen Dateien habe ich den Fehler, denn ich irgendwie aufgrund dessen was ich so halbwegs verstanden hatte fast klar war:
                          error message: PHP notice in file /web/1/000/020/033/35784/htdocs/wbb/lib/page/RGalleryImageWrapperPage.class.php (51): Undefined variable: gallery
                          Weil nun sieht ers ja als Variable an -.-

                          Kommentar


                          • #14
                            dann musst du dir dort nun $gallery besorgen, aber das weißt du vermutlich bereits

                            Kommentar


                            • #15
                              mache ich das indem ich es inkludiere oder gehts geschickter?

                              Kommentar

                              Lädt...
                              X