Ankündigung

Einklappen
Keine Ankündigung bisher.

Mini-Tutorial: Autoload Exception bei nichtgefundener klasse

Einklappen

Neue Werbung 2019

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

  • Mini-Tutorial: Autoload Exception bei nichtgefundener klasse

    hier ein kleiner codeschnipsel um nicht gefundene klassen in autoload als exception zu behandeln. (das erste sinnvolle mal das eval bentutzt wird!)

    PHP-Code:
    <?php

    function autoload($classname)
    {
             
    // try to load class
        
    if(is_file($classname.'.php'))
        {
            include_once(
    $classname.'.php');

            
    // if class was not in file
            
    if(!class_exists($classname))
                
    class_not_found($classname);
        }
        else
            
    class_not_found($classname);
    }

    function 
    class_not_found($classname)
    {
        eval(
    '
                       class '
    .$classname.'
                        {
                            public static function throw_autoload_exception()
                            {
                                throw new Exception(\'Class "'
    .$classname.'" not found!\');
                            }
                        }

                        '
    .$classname.'::throw_autoload_exception();
                 '
    );
    }

    spl_autoload_register('autoload');

    try
    {
           new 
    class_does_not_exists();
    }
    catch(
    Exception $exception)
    {
            echo 
    $exception->getMessage();
    }
    ist natürlich mehr zu debug zwecke zu gebrauchen, sieht aber schöner aus als ein "FATAL ERROR"
    [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
    [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
    [/B]

  • #2
    Dann lieber den Error-Handler entsprechend ausstatten, sonst wird beim nächsten Zugriff auf die Klasse (die ja jetzt existiert) einiges schiefgehen
    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

    Kommentar


    • #3
      Zitat von Chriz Beitrag anzeigen
      Dann lieber den Error-Handler entsprechend ausstatten,
      bei einem fatal error, bzw. E_ERROR, der bei einer nicht gefundenen klasse geworfen wird, ist schluss.

      Zitat von Chriz Beitrag anzeigen
      sonst wird beim nächsten Zugriff auf die Klasse (die ja jetzt existiert) einiges schiefgehen
      türlich, ich finds aber einfach unschön sowas entgegengeschmettert zu bekommen:

      Fatal error: Class 'my_class' not found in test.php on line 17
      so kann man wenigstens das script sauber zum abschluss bringen....
      [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
      [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
      [/B]

      Kommentar


      • #4
        Ah, dachte der Fehler wird mit dem letzten Atemzug doch noch an den ErrorHandler übergeben.
        "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

        Kommentar


        • #5
          1. Funktioniert das auch mit statischen Methodenaufrufen unbekannter Klassen?

          2. Und hier
          include($classname.'.php');
          sollte wohl zwingend ein include_once hin!

          3. Aus Debugging-Sicht finde ich es etwas seltsam, dass die Exception in der Klasse ausgelöst wird, die angeblich nicht existiert...
          throw new Exception(\'Class "'.$classname.'" not found!\');
          [COLOR="#F5F5FF"]--[/COLOR]
          [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
          [COLOR="#F5F5FF"]
          --[/COLOR]

          Kommentar


          • #6
            Zitat von nikosch Beitrag anzeigen
            1. Funktioniert das auch mit statischen Methodenaufrufen unbekannter Klassen?
            aber selbstverständlich:

            PHP-Code:
            try
            {
                
            do_not::$call_me;
                
            do_not::CALL_ME;
                
            do_not::call_me('!');
            }
            catch(
            Exception $exception)
            {
                    echo 
            $exception->getMessage();

            2. Und hier
            sollte wohl zwingend ein include_once hin!
            jep, erledigt.

            3. Aus Debugging-Sicht finde ich es etwas seltsam, dass die Exception in der Klasse ausgelöst wird, die angeblich nicht existiert...
            hätte ich dabei schreiben sollen:

            mir gefällt der trace dann besser, ansonsten steht da bloß das eval() ganz oben:

            Code:
            #0 D:\_projects\test.php(31) : eval()'d code(11): do_not::throw_autoload_exception()
            #1 D:\_projects\test.php(31): eval()
            #2 D:\_projects\test.php(15): class_not_found('do_not')
            #3 [internal function]: autoload('do_not')
            #4 D:\_projects\test.php(38): spl_autoload_call('do_not')
            #5 {main}
            [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
            [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
            [/B]

            Kommentar


            • #7
              Nice!
              [FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
              — The best things in life aren't things[/FONT]

              Kommentar


              • #8
                Ich find das immernoch unschön. Wie siehts mit Opcode-Caching aus, verhagelt das einem dann mal alles? Weiß mans? So fingen die kleinen Sünden von PHP 4 auch an, einfach Error by Design, aber es lief irgendwie. Für mich wäre das keine Option.

                Dann lieber ein kleines Skript bauen, dass das Projekt ins Tokens zerlegt und nach verwendeten Funktionen und Klassen sucht und entsprechend Empfehlung zum Aktivieren von Extensions oder Einbinden von Funktionen bringt. Das wäre schon interessanter. Klar es löst nicht das Problem.

                Andere Frage, kann ich bei einem PHP-Fehler noch schnell einen HTTP-500 senden, damit der Apache für die Fehlerseite einspringt?
                "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                Kommentar


                • #9
                  Zitat von Chriz Beitrag anzeigen
                  Ich find das immernoch unschön. Wie siehts mit Opcode-Caching aus, verhagelt das einem dann mal alles? Weiß mans? So fingen die kleinen Sünden von PHP 4 auch an, einfach Error by Design, aber es lief irgendwie. Für mich wäre das keine Option.
                  ich bin ehrlich gesagt der meinung, das php hier error by design betreibt. wenn es dir nicht gefällt eine klasse zu emulieren, so gib eine fehlermeldung samt einem exit aus. fällt aber eben auch nicht besser als die php interne methode aus.

                  Zitat von Chriz Beitrag anzeigen
                  Andere Frage, kann ich bei einem PHP-Fehler noch schnell einen HTTP-500 senden, damit der Apache für die Fehlerseite einspringt?
                  jein, schalte display_errors aus und es wird ein HTTP 500 bei einem parse und fatal error gesendet.
                  [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
                  [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
                  [/B]

                  Kommentar


                  • #10
                    ich bin ehrlich gesagt der meinung, das php hier error by design betreibt
                    Jein, wenn halt zur Laufzeit was fehlt wirds halt schwierig darauf zu reagieren. Vielleicht hiermit:
                    PHP: RuntimeException - Manual

                    Aber ob PHP jemals strikt und konsequent sein wird wag ich ja zu bezweifeln. Muss man sagen auch zurecht, grad für Einsteiger ist PHP halt das Paradies (ja altes Thema, ich schweif nich aus).

                    jein, schalte display_errors aus und es wird ein HTTP 500 bei einem parse und fatal error gesendet.
                    Guter Tipp, werd ich mal probieren.
                    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                    Kommentar


                    • #11
                      Zitat von Chriz Beitrag anzeigen
                      Jein, wenn halt zur Laufzeit was fehlt wirds halt schwierig darauf zu reagieren.Vielleicht hiermit:
                      PHP: RuntimeException - Manual

                      python lässt grüßen, ne

                      Zitat von Chriz Beitrag anzeigen
                      Aber ob PHP jemals strikt und konsequent sein wird wag ich ja zu bezweifeln. Muss man sagen auch zurecht, grad für Einsteiger ist PHP halt das Paradies (ja altes Thema, ich schweif nich aus).
                      wenn man 3 jahre über den sinn von namespaces diskutiert, glaube ich auch nicht mehr daran.
                      [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
                      [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
                      [/B]

                      Kommentar

                      Lädt...
                      X