„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Schlacht der Autoloader: PSR-0 gegen PSR-4

Schlacht der Autoloader: PSR-0 gegen PSR-4

Gepostet am 2025-03-25
Durchsuche:126

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 den Klassennamen ermöglichen, während PSR-4 die Ordnerstruktur vereinfachen und Remnants von PSR-0 entfernen.
  • psr-4, das als paketorientiertes Autolading 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 jedoch nicht den genauen Pfad einer Klasse aus ihrem voll qualifizierten Namen, während PSR-0 chaotisch sein kann, aber Entwickler mit älteren Namenskonventionen und Hilfsmittel bei der Lokalisierung einer Klasse aus seinem Namen aus dem Namen.
  • .

Wenn Sie in Ihrem PHP-Training an der Anfängerstufe vorbeigegangen sind, 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 Erfordernisse zu verwenden und einzuschließen.

.

psr-0

psr-0 befasst sich mit dem Namespace einer Klasse und erfasst ihren Standort auf der Festplatte aus dieser Information. Beispielsweise würde die Klasse \ zend \ mail \ meldung zu /path/to/project/lib/vendor/zend/mail/message.php.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 machen. Zend_mail_message würde auch zu /path/to/project/lib/vendor/zend/mail/message.php.php.php.php.php.php.php.

Komponist

Als der Komponist auftauchte 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:

Verkäufer/ perversor_name/ package_name/ src/ Perversor_name/ Package_name/ ClassName.php # vendor_name \ package_name \ className Tests/ Perversor_name/ Package_name/ Classnametest.php # vendor_name \ package_name \ classnametest
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
Das ist bestenfalls chaotisch, weil:

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

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 zusammen 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:

Verkäufer/ perversor_name/ package_name/ src/ ClassName.php # vendor_name \ package_name \ className Tests/ Classnametest.php # vendor_name \ package_name \ classnametest
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
Das Upgrade von PSR-0 war keine Option

Weil PSR-0 keinen Verdenke 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, weil es vor Einfachheit die Paketreinheit begünstigt.

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, sicher, dass die Kombination aus Lieferantenverpackung an einen beliebigen Ordner zuordnen kann und einen Infix der Ordner zwischen dem Kombination aus dem Lieferanten und dem Rest des vollqualifizierten Klassennamens zulassen.

Dies bedeutet, dass wir unsere Klassen überall in den Paketcode einfügen könnten, in dem 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 gibt der Entwurf ausdrücklich an, dass ein PSR-4-Autoloader niemals Ausnahmen werfen oder Fehler aufwerfen sollte, weil mehrere Autoloader möglicherweise registriert werden. Wenn man eine Klassen nicht lädt, sollten andere die Chance dazu erhalten-einen Fehler zu werfen und die Flussbrichts diese Kompatibilität zu stoppen. 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:

/path/to/packages/foo-bar/ src/ Baz.php # foo \ bar \ baz Qux/ Quux.php # foo \ bar \ qux \ quux Tests/ BAZTEST.PHP # FOO \ BAR \ BAZTEST Qux/ QuUxtest.php # foo \ bar \ qux \ quuxtest
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
würde so aussehen:

php // den Loader instanziieren $ lader = new \ Beispiel \ psr4autoloaderClass; // Registrieren Sie den Autoloader $ lader-> register (); // Registrieren Sie die Basisverzeichnisse für das Namespace -Präfix $ lader-> addnameSpace ('foo \ bar', '/path/to/pakete/foo-bar/src'); $ lader-> addnamespace ('foo \ bar', '/path/to/pakete/foo-bar/tests');
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
wo rufe \ foo \ bar \ qux \ quux; würde versuchen, aus dem ersten registrierten Verzeichnis zu laden, während neu \ foo \ bar \ qux \ quUxtest; würde versuchen, vom zweiten zu laden.

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

Abschluss

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 unterstrichen-namennamen-Benutzer) und hilft uns dabei, den Ort einer Klasse zu erkennen, indem sie nur ihren Namen betrachtet.

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?

Der primäre Unterschied zwischen PSR-0 und PSR-4 liegt in der Art und Weise, wie sie mit Namespaces und Verzeichnisstruktur umgehen. PSR-0 erfordert eine direkte Korrelation zwischen Namespaces und der Verzeichnisstruktur, was bedeutet, dass jeder im Namespace einem Verzeichnisabscheider entspricht. Andererseits ermöglicht PSR-4 einen flexibleren Ansatz, bei dem ein Teil des Namespace einem Verzeichnis zugeordnet werden kann und der Rest des Namespace der Subdirektoriestruktur zugeordnet werden kann. 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 bietet einen flexibleren Ansatz, mit dem Entwickler Namespaces in ein beliebiges Verzeichnis abbilden können und das Bedürfnis nach tiefen Verzeichnisnestern reduzieren können.

Kann ich im selben Projekt sowohl PSR-0 als auch PSR-4 im selben Projekt im selben Projekt im selben Projekt 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.

Wie verbessert sich PSR-4 auf PSR-0? 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 durch die Verzeichnisstruktur des Projekts.

Ist psr-0 veraltet?

Ja, PSR-0 wurde als veraltet gekennzeichnet. 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 Autoloading in php.

Wie funktioniert Autoloading in PSR-4?

In PSR-4 funktioniert Autoloading, indem ein Teil des Namespace in ein Verzeichnis abgebildet wird. Der Rest des Namespace wird dann der Unterverzeichnisstruktur zugeordnet. Dies ermöglicht einen flexibleren und effizienteren Ansatz für Autoloading.

Was sind die Vorteile der Verwendung von PSR-4?

psr-4 bietet mehrere Vorteile, einschließlich eines flexibleren Ansatzes für Autoloading, reduzierter Bedarf an tiefen Verzeichnisnestern und verbessertem Effizienz. Es ist auch der empfohlene Standard für Autoloading in PHP und macht es zu einer guten Wahl für neue Projekte.

Wie kann ich von PSR-0 zu PSR-4 migrieren? 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 erfordert PHP 5.3 oder höher. Wenn Sie eine ältere Version von PHP verwenden, müssen Sie upgraden, um PSR-4 zu verwenden.

Was ist die Zukunft des Autoladings in PHP? Auf absehbare Zeit ist PSR-4 jedoch der empfohlene Standard für Autolading in Php.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3