Kürzlich habe ich über Namespaces gelesen und wie sie nützlich sind. Ich erstelle gerade ein Projekt in Laravel und versuche, vom automatischen Laden der Klassenzuordnung zum Namespace zu wechseln. Ich kann jedoch nicht verstehen, was der tatsächliche Unterschied zwischen PSR-0 und PSR-4 ist.
Einige Ressourcen, die ich gelesen habe, sind ...
Was ich verstehe:
- PSR-4 konvertiert keine Unterstriche in Verzeichnistrennzeichen
- Bestimmte spezifische Regeln des Komponisten führen dazu, dass die Verzeichnisstruktur komplex wird, was wiederum den PSR-0-Namespace ausführlich macht und somit PSR-4 erstellt wurde
Beispiele, die den Unterschied erklären, wären willkommen.
Antworten:
Sie sind sich sehr ähnlich, daher ist es nicht verwunderlich, dass es etwas verwirrend ist. Die Zusammenfassung ist, dass PSR-0 einige Abwärtskompatibilitätsfunktionen für PEAR-artige Klassennamen hatte, die PSR-4 gelöscht hat, da es nur Code mit Namespace unterstützt. Darüber hinaus zwingt PSR-4 Sie nicht dazu, den gesamten Namespace als Verzeichnisstruktur zu verwenden, sondern nur den Teil, der dem Ankerpunkt folgt.
Zum Beispiel, wenn Sie definieren, dass der
Acme\Foo\
Namespace in verankert istsrc/
, mit PSR-0 bedeutet , es es aussehen wirdAcme\Foo\Bar
insrc/Acme/Foo/Bar.php
während in PSR-4 es für sie aussieht insrc/Bar.php
, so dass für kürzere Verzeichnisstrukturen. Auf der anderen Seite bevorzugen einige die vollständige Verzeichnisstruktur, um klar zu sehen, was sich in welchem Namespace befindet. Sie können also auch sagen, dassAcme\Foo\
sich dieser in befindetsrc/Acme/Foo
mit PSR-4, werden Ihnen das Äquivalent des PSR-0 Verhaltens gibt oben beschrieben.Kurz gesagt, für neue Projekte und für die meisten Absichten und Zwecke können Sie PSR-4 verwenden und alles über PSR-0 vergessen.
quelle
src/Bar.php
wenn Sie sagenAcme\Foo\ => src/
Hier sind die Hauptunterschiede,
1. Wenn Sie beispielsweise definieren, dass der
Acme\Foo\
Namespace in verankert istsrc/
,Acme\Foo\Bar
insrc/Acme/Foo/Bar.php
Acme\Foo\Bar
insrc/Bar.php(where Bar class is)
.2. PSR-4 konvertiert keine Unterstriche in Verzeichnistrennzeichen
3. Sie würden es vorziehen, PSR-4 mit Namespaces zu verwenden
4. PSR-0 funktioniert auch dann nicht, wenn sich der Klassenname vom Dateinamen unterscheidet, wie im obigen Beispiel dargestellt:
Acme\Foo\Bar
--->src/Acme/Foo/Bar.php
(für Bar-Klasse) wird funktionierenAcme\Foo\Bar
--->src/Acme/Foo/Bar2.php
(für Bar-Klasse) funktioniert nichtquelle
PSR-4 ist so etwas wie "relativer Pfad", PSR-0, "absoluter Pfad".
z.B
config:
PSR-0 Autoload:
PSR-4 Autoload:
Weitere Detailunterschiede zwischen PSR-0 und PSR-4 finden Sie hier: http://www.php-fig.org/psr/psr-4/
quelle
Namespace / Ordner-Konvention.
Klassen sollten entsprechend ihren Namespaces in Ordnern gespeichert werden.
Im Allgemeinen erstellen Sie ein src / -Verzeichnis in Ihrem Stammordner, das sich auf derselben Ebene wie vendor / befindet, und fügen dort Ihre Projekte hinzu. Unten finden Sie ein Beispiel für die Ordnerstruktur:
Unterschied zwischen psr-0 und psr-4
psr-0
Es ist veraltet. Wenn
vendor/composer/autoload_namespaces.php
Sie sich die Datei ansehen, sehen Sie die Namespaces und die Verzeichnisse, denen sie zugeordnet sind.composer.json
psr-4
Wenn
vendor/composer/autoload_psr4.php
Sie sich die Datei ansehen, sehen Sie die Namespaces und die Verzeichnisse, denen sie zugeordnet sind.composer.json
composer.json
quelle
Auch wenn ich es versucht habe, ist Composer ein Chaos. Leider ist es die einzige Alternative auf dem Markt.
Warum ist ein Chaos?
Die automatische Vervollständigung des Komponisten funktioniert einwandfrei, wenn Sie die Kontrolle über den Code haben. Wenn Sie jedoch ein anderes Projekt importieren, stehen Ihnen viele Stile und Möglichkeiten zum Erstellen von Ordnern zur Verfügung. Einige Projekte sind beispielsweise /company/src/class.php, während andere company / class.php und andere company / src / class / class.php sind
Ich habe eine Bibliothek erstellt, die es löst:
https://github.com/EFTEC/AutoLoadOne (kostenlos, MIT).
Es generiert eine automatische Schließung, indem alle Klassen eines Ordners gescannt werden, sodass es in jedem Fall funktioniert (psr-0 psr-4, Klassen ohne Namespace, Datei mit mehreren Klassen.
edit: Und wieder ohne Grund herabgestimmt. ;-);
quelle