hotti: spl_autoload_unregister

hi,

wenn ich die Twig-Engine einbinde, schlägt meine registered autoload-Method zu und es wird eine Exception geworfen, weil die Pfade nicht stimmen. Benutze ich spl_autload_unregister/register vorher/nachher, geht alles in Ordnung, sieht so aus:

  
					spl_autoload_unregister(array($this, 'response_auto_include'));  
					require_once $this->INCPATH.'/Twig/Autoloader.php';  
					Twig_Autoloader::register();  
					$twig = new Twig_Environment(new Twig_Loader_String(), array('autoescape' => false));  
					spl_autoload_register(array($this, 'response_auto_include'));  

Meine Frage ist: Ist das so Ok, habe ich dieses Thema richtig verstanden?

Hotti

  1. Ergänzung:

    Nach der Zeile
    Twig_Autoloader::register();

    hätte ich erwartet, dass Twig einen eigenen Autoloader implememtiert hat, so dass der in meiner Klasse registrierte Autoloader nicht greifen sollte. Dies passiert jedoch mit der Zeile

    $twig = new Twig_Environment(new Twig_Loader_String(), array('autoescape' => false));

    Workaround s. Eingangspost: ich nehme meinen Autoloader vorher raus und tu ihn dann wieder rein, wenn die Twig-Engine eingebunden wurde.

    Mir scheint das irgendwie unsauber...

    Horst Hacke

  2. Moin!

    wenn ich die Twig-Engine einbinde, schlägt meine registered autoload-Method zu und es wird eine Exception geworfen, weil die Pfade nicht stimmen.

    Wirft dein Autoloader eine Exception? Nicht gut. Autoload-Funktionen sollten prüfen, ob der Klassenname, der gefordert ist, von ihr geladen werden kann, z.B. weil der Prefix des Namens oder Namespaces stimmt.

    Wenn nicht, sollte die Funktion nichts tun - andere Autoload-Funktionen, die registriert wurden, könnten sich um diese Klasse kümmern.

    Benutze ich spl_autload_unregister/register vorher/nachher, geht alles in Ordnung, sieht so aus:

    Das ist ein Indiz für fehlerhaftes Verhalten deines Autoloaders, denn damit basteltst du an der Reihenfolge der Autoload-Funktionen herum.

    - Sven Rautenberg

    1. Moin!

      wenn ich die Twig-Engine einbinde, schlägt meine registered autoload-Method zu und es wird eine Exception geworfen, weil die Pfade nicht stimmen.

      Wirft dein Autoloader eine Exception?

      Ja.

      Nicht gut. Autoload-Funktionen sollten prüfen, ob der Klassenname, der gefordert ist, von ihr geladen werden kann, z.B. weil der Prefix des Namens oder Namespaces stimmt.

      Wenn nicht, sollte die Funktion nichts tun - andere Autoload-Funktionen, die registriert wurden, könnten sich um diese Klasse kümmern.

      Ok, wenn das so ist...

      Benutze ich spl_autload_unregister/register vorher/nachher, geht alles in Ordnung, sieht so aus:

      Das ist ein Indiz für fehlerhaftes Verhalten deines Autoloaders, denn damit basteltst du an der Reihenfolge der Autoload-Funktionen herum.

      ... darf eine autoload_function wohl keine Exception werfen. Die Frage ist dann: Wie fange ich einen etwaigen Fehler auf?

      Hotti

      1. Moin!

        Benutze ich spl_autload_unregister/register vorher/nachher, geht alles in Ordnung, sieht so aus:

        Das ist ein Indiz für fehlerhaftes Verhalten deines Autoloaders, denn damit basteltst du an der Reihenfolge der Autoload-Funktionen herum.

        ... darf eine autoload_function wohl keine Exception werfen. Die Frage ist dann: Wie fange ich einen etwaigen Fehler auf?

        An welche Fehler denkst du?

        Deine Autoload-Funktion hat eine ziemlich genau umrissene Funktion: Sie bekommt den Namen einer gewünschten Klasse, eines Interfaces oder eines Traits (ab 5.4) und muss dazu die passende Datei finden und einbinden.

        Was kann dabei schiefgehen?

        Erstens: Für den gewünschten Namen ist die Funktion gar nicht zuständig.
        Dann: Nichtstun.

        Zweitens: Für den Namen ist die Funktion zuständig, kann die Datei aber nicht finden.

        Dann Möglichkeit A: Nichtstun. PHP wird das Fehlen der gewünschten Klasse bemerken und den Programmablauf abbrechen.

        Möglichkeit B: Du kannst natürlich versuchen, anhand des Klassennamens irgendwas hinzuhexen. Eine Autoload-Funktion darf den Klassencode nicht nur mit include/require bekannt machen (die *_once-Varianten sind überflüssig, weil einmal bekannte Klassen nicht noch ein zweites Mal den Autoloader triggern), sondern auch via eval(). Das allerdings wäre definitiv etwas, was man trennen sollte. De fakto ist zu diesem Zeitpunkt deine Applikation kaputt, denn sie will Code verwenden, der nicht existiert. Sorge dafür, dass das nicht passiert - sowas fällt schnell auf.

        - Sven Rautenberg