Ankündigung

Einklappen
Keine Ankündigung bisher.

register_shutdown_function(): Invalid shutdown callback

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

  • register_shutdown_function(): Invalid shutdown callback

    Hallo Leute,

    ich habe mal zum Testen eine Datei gebaut:

    PHP-Code:
    <?php

    register_shutdown_function
    ('my_Shutdown_Handler::test()');


    class 
    my_Shutdown_Handler
    {
       public static function 
    test()
       {
          
    $error error_get_last();
          
    print_r($error);
       }
    }


    $test = NEW test();

    ?>
    Eigentlich eine einfache Sache aber es will nicht so wie ich es gerne hätte.

    Ich bekomme dort immer diesen Nervigen Fehler.

    Warning: register_shutdown_function(): Invalid shutdown callback 'my_Shutdown_Handler::test()' passed in C:\xampp\htdocs\test.php on line 3

    Wo mache ich denn meinen Denkfehler?

    Danke und Gruß
    René


  • #2
    Müsste ohne die Klammern sein...
    PHP-Code:
    register_shutdown_function('my_Shutdown_Handler::test'); 
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      PHP-Code:
      class my_Shutdown_Handler

      //...

      $test = NEW test(); 
      Deine Klasse heißt übrigens nicht test. Nur so als Info.
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Also die Klammern ändern nichts.

        Und das mit der Klasse Test ist nur um einen Fehler zu erzeugen

        Kommentar


        • #5
          Also der folgende Code:
          PHP-Code:
          class my_Shutdown_Handler
          {
             public static function 
          test()
             {
                
          $error error_get_last();
                
          print_r($error);
             }
          }

          register_shutdown_function('my_Shutdown_Handler::test');


          $test = NEW test(); 
          erzeugt bei mir die folgende Ausgabe:
          Code:
          PHP Fatal error:  Uncaught Error: Class 'test' not found in C:\code\test.php:22
          Stack trace:
          #0 {main}
            thrown in C:\code\test.php on line 22
          
          Fatal error: Uncaught Error: Class 'test' not found in C:\code\test.php:22
          Stack trace:
          #0 {main}
            thrown in C:\code\test.php on line 22
          Array
          (
              [type] => 1
              [message] => Uncaught Error: Class 'test' not found in C:\code\test.php:22
          Stack trace:
          #0 {main}
            thrown
              [file] => C:\code\test.php
              [line] => 22
          )
          Windows 10, PHP 7.2.4


          Wenn du nur Fehler abfangen willst, benutz doch den dafür vorgesehen error handler:
          http://de2.php.net/manual/en/functio...or-handler.php

          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Klassen müssen vor ihrer Verwendung initialisiert worden sein.

            Anders sieht es aus bei Funktionen, die können auch später im Code auftauchen.
            Dieser Code funktioniert
            PHP-Code:
            register_shutdown_function('my_Shutdown_Handler');

            @
            $test = NEW test();



            function 
            my_Shutdown_Handler() {
               
            $last_error error_get_last();

                  echo 
            "<pre>";
                  
            print_r($last_error);
                  echo 
            "<pre>";


            Kommentar


            • #7
              my_Error_Handler::registerErrorHandler(); habe ich schon aber der fängt noch keine Fatal Errors ab.

              Deswegen und weil es schöner aussieht und zusammengehört wollte ich das was protestix geschrieben hat mit in die Klasse packen.

              Bin dabei aber über den Invalid shutdown callback gestolpert und daraus resultierte dann auch meine Frage.

              Also vermute ich mal das ich das nicht in eine Klasse ausgelagert bekomme und es somit als Funktion lösen muss


              Gruß
              René

              Kommentar


              • #8
                Hast du das alles nicht gelesen oder nicht verstanden?.

                Isteglitz hat doch gezeigt wie es geht.

                Die Klasse muss lediglich an den Anfang, das ist nun mal so festgelegt bei PHP, das hast du oben im ersten Beitrag nicht gemacht.

                Das mit der Klasse funktioniert dann genauso wie nur als Funktion.

                Kommentar


                • #9
                  protestix du hast ja recht!

                  Ich habe alles gelesen aber nicht richtig verstanden.

                  Ich danke für den Hinweis ich hatte es einfach nicht richtig verstanden.

                  Jetzt geht es und das Freut mich.

                  Vielen Dank für die Hilfe von euch.

                  Gruß
                  René

                  Kommentar


                  • #10
                    Zitat von Renede Beitrag anzeigen
                    my_Error_Handler::registerErrorHandler(); habe ich schon aber der fängt noch keine Fatal Errors ab.
                    Wird er auch nie (ist auch dokumentiert)... ein fatal error kann z.B. ein Parserfehler sein, dann wird überhaupt kein Script ausgeführt, damit auch niemals der (in PHP geschriebene) error-handler.
                    The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING,E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      Die register_shutdown_function triggert immer wenn der Skriptdurchlauf beendet wird. Wenn man dort den letzten Fehler abfragt wird einem der Fatal Error ausgegeben, wenn der zum Skriptende geführt hat. (Wenn das Skript aber nicht durch den Fehler beendet wurde, können einem auch Warnings und Notices gegeben werden, da sollte man nicht vergessen zu prüfen was für einen Fehler man in der Hand hat)

                      In einem meiner Projekte nutz ich das um in solchen Fällen eine Email an die Entwickler schicken zu lassen, für den User wird eine Flashmessage vorbereitet und er wird umgeleitet.
                      Relax, you're doing fine.
                      RTFM | php.de Wissenssammlung | Datenbankindizes | Stay fit

                      Kommentar


                      • #12
                        Danke für die Informationen.

                        Gruß
                        René

                        Kommentar


                        • #13
                          Sofern du einen zentralen Einstiegspunkt für alle Requests in deine App hast, kannst du auch die Parserfehler behandeln.
                          Kann dann zum Beispiel so aussehen:

                          PHP-Code:
                          <?php
                          register_shutdown_function
                          ('error_handler');

                          function 
                          error_handler()
                          {

                            
                          $lasterror error_get_last();
                            switch (
                          $lasterror['type'])
                            {
                                case 
                          E_ERROR:
                                case 
                          E_CORE_ERROR:
                                case 
                          E_COMPILE_ERROR:
                                case 
                          E_USER_ERROR:
                                case 
                          E_RECOVERABLE_ERROR:
                                case 
                          E_CORE_WARNING:
                                case 
                          E_COMPILE_WARNING:
                                case 
                          E_PARSE:
                                case 
                          E_WARNING:      
                                  
                          var_dump($lasterror); // bzw. dein error handler
                            
                          }
                          }

                          // Aufruf deiner App
                          //$application->bootstrap()->run();

                          // oder als einfaches Beispiel:
                          include("file_with_parse_error.php");

                          Kommentar


                          • #14
                            Wobei Parse Error in einer Produktivumgebung praktisch nicht auftreten können (außer der Server wird gehackt oder der Festplattencontroller hat einen gravierenden Fehler). Und in der Entwicklungsumgebung hat man sowieso einen Debugger oder zumindest das Error-Log permanent offen. Von daher frage ich mich, was das bringen soll außer Beschäftigungstherapie.

                            Kommentar


                            • #15
                              Zitat von hellbringer Beitrag anzeigen
                              Wobei Parse Error in einer Produktivumgebung praktisch nicht auftreten können (außer der Server wird gehackt oder der Festplattencontroller hat einen gravierenden Fehler). Und in der Entwicklungsumgebung hat man sowieso einen Debugger oder zumindest das Error-Log permanent offen. Von daher frage ich mich, was das bringen soll außer Beschäftigungstherapie.
                              "Hotfixes" direkt auf dem prod. Webserver mit Vertippern drin.
                              Wenn dann direkt eine Mail kommt, weiss man wenigstens direkt, wem man dafür auf die Finger hauen muss

                              Kommentar

                              Lädt...
                              X