Heim > Backend-Entwicklung > PHP-Tutorial > Schlacht der Autoloader: PSR-0 gegen PSR-4

Schlacht der Autoloader: PSR-0 gegen PSR-4

Christopher Nolan
Freigeben: 2025-02-23 08:45:11
Original
198 Leute haben es durchsucht

Battle of the Autoloaders: PSR-0 vs. PSR-4

Schlacht der Autoloader: PSR-0 gegen PSR-4

Key Takeaways

  • PSR-0 und PSR-4 sind autoladierende Standards in PHP, wobei PSR-0 auf dem Namespace einer Klasse basiert und Unterstriche in Klassennamen zulässt, während PSR-4 die Ordnerstruktur vereinfachen und Remnants von PSR- entfernen soll. 0.
  • PSR-4, das als paketorientiertes Autoloading bezeichnet wird, ermöglicht sauberere Pakete, ist jedoch komplizierter zu implementieren. Es stellt auch sicher, dass Autoloader niemals Ausnahmen werfen oder Fehler aufnehmen sollten, wodurch die Kompatibilität mit mehreren Autoloadern aufrechterhalten wird.
  • Sowohl PSR-0 als auch PSR-4 haben ihre Vor- und Nachteile: PSR-4 ermöglicht einfachere Ordnerstrukturen, zeigt aber nicht den genauen Weg einer Klasse aus ihrem voll qualifizierten Namen, während PSR-0 chaotisch sein kann, aber nicht Unterstützt Entwickler ältere Namenskonventionen und hilft bei der Lokalisierung einer Klasse aus ihrem Namen.

Wenn Sie in Ihrem PHP-Training die Anfängerstufe überschritten haben, haben Sie von PSR-0 gehört-einem Autoloading-Standard, der Möglichkeiten definiert, wie sie automatisch PHP-Klassen in Ihren Code einbeziehen können, ohne Anweisungen wie Anforderung zu verwenden und einzuschließen.

psr-0

PSR-0 befasst sich mit dem Namespace einer Klasse und erfasst ihren Standort auf der Festplatte von diesen Informationen. Zum Beispiel würde die Klasse ZendmailMessage zu /path/to/project/lib/vendor/zend/mail/message.php.

führen

PSR-0 unterstützt auch Unterstriche in den Klassennamen als Alternative, um den Übergang von 5.2 und früher einfacher zu gestalten. Zend_mail_message würde auch zu /path/to/project/lib/vendor/zend/mail/message.php.

führen

Komponist

Als der Komponist aufgetaucht ist und die Welt der PHP -Paketmanagement im Sturm übernahm, änderten sich die Dinge. Aufgrund einiger seiner Regeln duplizierten Ordner oft dupliziert und wurden zu tief, als sie die PSR-0-Installationen über Komponisten betrachteten. Zum Beispiel endeten einige Ordnerstrukturen wie folgt:

vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
Nach dem Login kopieren
Nach dem Login kopieren

Das ist bestenfalls chaotisch, weil:

Die Verzeichnisse "SRC" und "Tests" müssen Anbieter- und Paketverzeichnisnamen enthalten. Dies ist ein Artefakt der PSR-0-Einhaltung.

Daher haben sich einige hochqualifizierte PHP-Entwickler zusammengetan und einen Vorschlag für einen neuen Standard zusammengestellt: PSR-4.

psr-4

PSR-4 zielt darauf ab, bei Bedarf zu ergänzen und mit PSR-0 zu arbeiten, und ersetzen Sie es nicht vollständig. Es kann, muss es aber nicht. Das Hauptziel von PSR-4 ist es, die Überreste von PSR-0 und die vor 5.3 Tage vollständig zu entfernen und eine prägnantere Ordnerstruktur zu ermöglichen. Mit PSR-4 würde der obige Ordnerbaum so aussehen:

vendor/
    vendor_name/
        package_name/
            src/
                ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
Nach dem Login kopieren
Nach dem Login kopieren

Das Upgrade von PSR-0 war keine Option

Weil PSR-0 keinen Fürblerpfad zwischen Teilen des Klassennamens

zulässt

Dies ist sehr wichtig-es bedeutet, dass die Implementierung von PSR-4, während es viel sauberere Pakete ermöglicht, weitaus komplizierter zu implementieren ist. Wir nennen PSR-4-Paket-orientierte Autoloading, da es die Sauberkeit der Packung vor Einfachheit bevorzugt.

Der gewählte Ansatz

Die vorgeschlagenen Ziele lauten wie folgt: Behalten Sie die PSR-0-Regel, dass alle Pakete mindestens zwei Namespace-Levels (Anbieter und Paket) enthalten müssen von Ordnern zwischen der Kombination aus Lieferantenverpackung und dem Rest des voll qualifizierten Klassennamens.

Dies bedeutet, dass wir unsere Klassen überall in den Paketcode einfügen könnten, wo es uns als Menschen sinnvoll ist, und sie trotzdem reibungslos in PHP verwenden, ohne alternative Ladetechniken zu schreiben oder auf manuelles Laden zu greifen.

Darüber hinaus wird ausdrücklich angibt Ein Fehler und ein Stoppen des Flusses bricht diese Kompatibilität aus. Wenn zusätzliche Informationen über den Fehler erforderlich sind, sollte man einen PSR-3-kompatiblen Logger oder andere willkürliche Mittel verwenden.

Wie in der Beispieldatei dargestellt, unter Verwendung des PSR-4-Autoloaders, um Klassen aus der folgenden Struktur zu laden:

vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
Nach dem Login kopieren
Nach dem Login kopieren

würde so aussehen:

vendor/
    vendor_name/
        package_name/
            src/
                ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
Nach dem Login kopieren
Nach dem Login kopieren

wo rufe neue foobarquxquux an; würde versuchen, aus dem ersten registrierten Verzeichnis zu laden, während neuer Foobarquxquuxtest; würde versuchen, vom zweiten zu laden.

Dieses Beispiel zeigt auch die Verwendung mehrerer Ordner pro einzelner Namespace.

Schlussfolgerung

Es gibt keine Silberkugel im Autolading. Jeder Ansatz bringt einige Vor- und Nachteile mit sich-PSR-4 würde einfachere Ordnerstrukturen ermöglichen, verhindern jedoch, dass wir den genauen Weg einer Klasse nur durch Betrachtung des voll qualifizierten Namens kennen. PSR-0 hingegen ist chaotisch auf der Festplatte, unterstützt jedoch Entwickler, die in der Vergangenheit festsitzen (die unterstrichenen Nutzer) und hilft uns dabei, den Ort einer Klasse zu erkennen, indem wir nur ihren Namen betrachten.

Wie denkst du über PSR-4? Lassen Sie uns in den Kommentaren unten wissen oder Ihre Meinung in einer der vielen Debatten ausdrücken.

So oder so-es besteht kein Zweifel, dass paketorientiertes Autoloading hier bleibt. Wenn nicht formell als Standard akzeptiert, wird von Personen, die es brauchen, benutzerdefiniert. Es liegt an uns, sich der Diskussion anzuschließen und den Begriff genug zu verbessern, um diesen formellen Zustand zu erreichen.

häufig gestellte Fragen zu PSR-0 und PSR-4 Autoloading

Was ist der Hauptunterschied zwischen PSR-0 und PSR-4? PSR-0 erfordert eine direkte Korrelation zwischen Namespaces und der Verzeichnisstruktur, was bedeutet, dass jeder im Namespace einem Verzeichnisabscheider entspricht. Auf der anderen Seite ermöglicht PSR-4 einen flexibleren Ansatz, bei dem ein Teil des Namespace jedem Verzeichnis zugeordnet werden kann und der Rest des Namespace der Unterverzeichnisstruktur zugeordnet werden kann.

Warum war es PSR-4 wurde eingeführt, als PSR-0 bereits vorhanden war? Die strenge Korrelation von PSR-0 zwischen Namespaces und Verzeichnisstruktur führte zu tief verschachtelten Verzeichnissen, die nicht immer praktisch oder effizient waren. PSR-4 liefert einen flexibleren Ansatz, mit dem Entwickler Namespaces in ein beliebiges Verzeichnis abbilden können, wodurch die Notwendigkeit eines tiefen Verzeichnisses verringert wird.

Kann ich sowohl PSR-0 als auch PSR-4 im selben Projekt verwenden? >

Ja, es ist möglich, sowohl PSR-0 als auch PSR-4 im selben Projekt zu verwenden. Es ist jedoch wichtig zu beachten, dass sie nicht verwendet werden sollten, um dieselben Klassen zu automatisieren. Die Verwendung beider Standards kann in großen Projekten von Vorteil sein, bei denen ein Legacy-Code dem PSR-0-Standard folgt, während neuerer Code dem PSR-4-Standard folgt.

PSR-4 verbessert sich bei PSR-0, indem sie einen flexibleren Ansatz für das Autolading liefert. Es ermöglicht den Entwicklern, einen Teil des Namespace in jedem Verzeichnis abzubilden und die Notwendigkeit eines tiefen Verzeichnisses zu verringern. Dies erleichtert die Verwaltung und Navigation in der Verzeichnisstruktur des Projekts. Dies bedeutet, dass es zwar noch funktional ist, es jedoch nicht für die Verwendung in neuen Projekten empfohlen wird. PSR-4 ist der empfohlene Standard für das Autoloading in Php. . Der Rest des Namespace wird dann der Unterverzeichnisstruktur zugeordnet. Dies ermöglicht einen flexibleren und effizienteren Ansatz für das Autolading. Notwendigkeit eines tiefen Verzeichnisses und verbesserte Effizienz. Es ist auch der empfohlene Standard für Autoloading in PHP und macht es zu einer guten Wahl für neue Projekte. Zu psr-4 beinhaltet die Änderung der Art und Weise, wie Namespaces und Verzeichnisse zugeordnet werden. In PSR-4 kann ein Teil des Namespace jedem Verzeichnis zugeordnet werden, und der Rest des Namespace kann der Unterverzeichnisstruktur abgebildet werden. Dies erfordert möglicherweise die Umstrukturierung der Verzeichnisstruktur Ihres Projekts.

Kann ich PSR-4 in älteren PHP-Versionen verwenden?

PSR-4 benötigt PHP 5.3 oder höher. Wenn Sie eine ältere Version von PHP verwenden, müssen Sie ein Upgrade für die Verwendung von PSR-4 verwenden. PHP wird sich wahrscheinlich weiterentwickeln, wobei neue Standards und Praktiken eingeführt werden, während sich die Sprache und ihr Ökosystem weiterentwickeln. Auf absehbare Zeit ist PSR-4 jedoch der empfohlene Standard für das Autolading in Php.

Das obige ist der detaillierte Inhalt vonSchlacht der Autoloader: PSR-0 gegen PSR-4. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage