it-swarm.com.de

Warum brauchen wir einen System-Autoloader, wenn wir alle bereit sind, Composer Autoloading) zu verwenden?

Es gibt eine Klasse namens JLoader, die über Techniken zum automatischen Laden der Bibliothekspakete verfügt.

Warum brauchen wir eine Klasse zum Laden, wenn wir bereits Composer Autoloading) haben?

Was ist das registerPrefix in der JLoader-Klasse?

5

Mein Verständnis von Autoloading ist ziemlich rudimentär, aber da dies 4 Stimmen und keine Antworten hat, denke ich, dass ich es versuchen werde. Bitte fügen Sie sachkundigere Typen Korrekturen oder eine bessere Antwort usw. hinzu.

Kurze Antwort

Der composer Autoloader wird zum automatischen Laden der PHP-Pakete in Bibliotheken/Anbietern verwendet. Die JLoader-Autoloader (es können einige in die Warteschlange gestellt werden) laden alles andere außer dem FOF-Autoloader und allen anderen Autoloadern Erweiterungsregister. Der composer Autoloader ist nicht das flexibelste System, das zur Laufzeit geändert werden kann, und es gibt eine Reihe von Vorteilen, wenn mehrere Autoloader in die Warteschlange gestellt werden, anstatt eines einzigen, der sowohl zwischengespeicherte als auch Laufzeitpfadsuchstrategien implementiert .

Lange Antwort

PHP bietet eine einfache Möglichkeit, mit Ladeklassen umzugehen, ohne include- oder require-Anweisungen verwenden zu müssen - Autoloader! Sie funktionieren, indem ein Fehler "Klasse nicht gefunden" zugelassen wird, dass registrierte Autoloader die Klasse finden und laden, bevor sie mit dem Prozess fortfahren. Auf diese Weise müssen Sie nicht überall Anforderungsanweisungen schreiben, aber was noch wichtiger ist, es ermöglicht Ihrem PHP), nur die Klassen zu laden, die aufgerufen werden, nicht alle Klassen, die möglicherweise aufgerufen werden.

PHP Doc zur Registrierung von Autoloadern

https://www.php.net/manual/en/function.spl-autoload-register.php

Es kann mehr als ein Autoloader registriert werden, und wenn ein Autoloader nicht weiß, wo sich eine Klasse befindet, kann der nächste Autoloader in der Warteschlange loslegen und so weiter und so fort ...

Autoloader sind nicht magisch, sie müssen jeweils eine Strategie implementieren, um die Datei mit der aufgerufenen Klasse darin zu finden. Der Autolader composer hat mehrere Strategien, die er verwendet, aber es gibt zwei grundlegende: PSR-4 (wobei jedes Paket einer festgelegten Verzeichnisstruktur und einem festgelegten Namensabstandsschema folgen muss) und die Klassenzuordnung (verwendet) um die Legacy-Code hinzuzufügen, die mit einer anderen Struktur übereinstimmt). Die vollständige Liste finden Sie hier:

https://getcomposer.org/doc/04-schema.md

Aber im Allgemeinen hat composer alle seine Strategien, um Klassennamen und Namespaces in Pfade umzuwandeln, die bereits vor der Laufzeit zwischengespeichert und bereit sind, damit dies so schnell wie möglich möglich ist. Eine Reihe von Joomla-Anbietern Pakete sind bereits mit composer) enthalten, und Sie können sie alle in/library/vendor/joomla/sehen

Der in der JLoader-Klasse implementierte Joomla-Autoloader konzentriert sich mehr auf das Laden nicht nur des Joomla-Anwendungscodes, sondern auch des Codes, der von allen Kernerweiterungen und Erweiterungen von Drittanbietern benötigt wird. Der JLoader verfügt auch über eine Reihe von Strategien zum Auffinden von Klassen, einschließlich der Registerpräfixmethode.

https://api.joomla.org/cms-3/classes/JLoader.html#method_registerPrefix

mit registerPrefix können Klassen ohne Namespace einfach Klassen finden, die mit einigen Zeichen beginnen, um in einem Pfad zu suchen. Es gibt bereits viele Beispiele für die Verwendung von JLoader registerPrefix. Schreiben wir also einen Autoloader von Grund auf mit einer ähnlichen Strategie.

Angenommen, Sie möchten in der Eingabedatei Ihrer benutzerdefinierten Komponente Ihre eigene klassische MVC schreiben PHP ohne Verwendung des Joomla-Komponentencodes. Dann können Sie Ihren eigenen Autoloader nur hinzufügen, wenn Ihre Komponente aufgerufen wird .

Angenommen, Ihr Präfix ist Xyz und Ihre Klassen sind wie folgt angeordnet:

/components/com_example/views/XyzView.php
/components/com_example/views/XyzExampleView.php
/components/com_example/models/XyzModel.php
/components/com_example/models/XyzExampleModel.php

Und XyzExampleView.php würde natürlich enthalten:

Class XyzExampleView extends XyzView {/* real code */}

In der Komponenteneintragsdatei würden Sie vor dem Starten einer Art Router/Front-Controller usw. die folgende Art von Autoloader hinzufügen:

function autoload_class($class) {
    if(strpos($class,'Xyz') === false){
        // the called class is not ours, so let this through to the next autoloader in the queue
        return;
    } elseif(strpos($class,'View') !== false){
        include 'views/' . $class . '.php';
    } elseif (strpos($class,'Controller') !== false){
        include 'controllers/' . $class . '.php';
    } elseif (strpos($class,'Model') !== false){
        include 'models/' . $class . '.php';
    } else {
        include 'helpers/' . $class . '.php';
    }
}
spl_autoload_register('autoload_class');

Das oben Gesagte geht sehr davon aus, dass keine Klassen anderer Personen mit Xyz beginnen, und folgt der sehr strengen Regel, dass jede Klasse, die automatisch geladen werden soll, mit Xyz beginnt. Aber wenn das sicher genug ist, ist das oben Genannte bereit zu gehen.

7
jamesgarrett

James hat ein gutes Unterscheidungsmerkmal zwischen dem composer Autoloader und JLoader) gemacht. Ich denke, das andere, was Sie hier vermissen, ist, dass JLoader massiv älter ist als composer existierend (und selbst wenn) composer gab es erst, als die stabile Version wirklich auf Shared Hosting vollständig nutzbar wurde).

Mit der Zeit werden wir die Dinge langsam in Richtung composer Autoloader im Kern) bewegen. Zum Beispiel werden in Joomla 4.0 alle Kernbibliotheken darauf verschoben. Daneben muss dies jedoch zusammen mit a erfolgen Wechseln Sie von vielen unserer Kernfabriken zur Verwendung der Abhängigkeitsinjektion von den alten statischen Methoden, die wir in JFactory verwendet haben. Bevor mehrere Hauptkomponenten im Ökosystem die JLoader-Zuordnungen tatsächlich überschrieben, um ihre eigenen Klassen zu injizieren (ein gutes Beispiel sind mehrere MailChimp-Erweiterungen, die die JMail-Klasse überschreiben ).

registerPrefix stammt aus einer Zeit, bevor Namespaces in PHP existierten. Aus diesem Grund haben wir etwas ganz Besonderes für Joomla gebaut. Jetzt gibt es Namespaces. Wir haben den Umzug gestartet (und sind daher von registerPrefix weggegangen), wobei die Kernbibliotheken in Joomla 3.8 Namespaces haben. Aber im Grunde genommen haben Sie statt eines Namespace-Segments, das einem Verzeichnis entspricht, /folder/subfolder/class entspricht einer Klasse von PrefixFolderSubfolderClass

Hoffentlich gibt dies einen historischen Hintergrund, der über die bereits erwähnten technischen Details hinausgeht!

4
George Wilson