Eine Einführung in die PHP-Standardempfehlung (PSR)
Veröffentlicht: 2019-12-24Es war einmal, auf einer Konferenz, die leitenden Entwickler einer Auswahl von Frameworks setzten sich im selben Raum zusammen und vereinbarten einige Standards für alle ihre Projekte. Ziel war es, PHP-Frameworks und -Bibliotheken für Benutzer leichter kombinierbar zu machen. Das war die Geburtsstunde von php-fig: the PHP Framework Interop Group. Diese Gruppe großartiger Personen beaufsichtigt die PHP-Standardempfehlungen (PSRs).
Die PHP Standard Recommendation (PSR) ist eine PHP-Spezifikation, die von der PHP Framework Interoperability Group (PHP-FIG) veröffentlicht wurde. Es dient der Standardisierung von Programmierkonzepten in PHP. Ziel ist es, die Interoperabilität der Komponenten zu ermöglichen. Die PHP-FIG wird von mehreren Gründern von PHP-Frameworks gebildet.
PSR-0 & PSR-4
Diese beschreiben eine Spezifikation für das automatische Laden von Klassen aus Dateipfaden. PSR-0 und PSR-4 sind beides Standards bezüglich Namespaces, Klassennamen und Dateipfaden. Dieser PSR beschreibt auch, wo Dateien abgelegt werden, die gemäß der Spezifikation automatisch geladen werden.
Automatisches Laden
Autoloading ist eine Funktion, die Entwicklern dabei hilft, PHP-Klassen automatisch einzubinden, ohne überall überladene Include/Require-Anweisungen schreiben zu müssen.
In PHP wird die Klassendefinition mit den Befehlen require oder include in die Dateien geladen, die sie aufrufen, dh vor der Verwendung, wie unten gezeigt.

Der obige Ansatz wirft einige Probleme auf, als ob wir Dutzende externer Klassen haben, die in einer Datei verwendet werden sollen, und wir beginnen, Zeilen mit require/include-Anweisungen direkt am Anfang einer Quelldatei zu schreiben.
Um dieses Problem zu lösen, hat PHP 5 die magische Funktion __autoload() eingeführt, die automatisch aufgerufen wird, wenn Ihr Code auf eine Klasse oder Schnittstelle verweist, die noch nicht geladen wurde.

Hier ist ein Beispiel für eine grundlegende __autoload()-Implementierung:

Der größte Nachteil der Funktion __autoload() besteht darin, dass Sie nur einen Autoloader damit bereitstellen können. PHP 5.1.2 hat eine weitere Autoloading-Funktion (spl_autoload_register) eingeführt, um mit der Einschränkung von __autoload umzugehen.
Die Einführung von spl_autoload_register() gab Programmierern die Möglichkeit, eine Autoload-Kette zu erstellen, eine Reihe von Funktionen, die aufgerufen werden können, um zu versuchen, eine Klasse oder ein Interface zu laden.
Beispielsweise:


Autoloading war so eine großartige Idee, dass jedes Projekt damit begann. Unweigerlich erstellte jeder seine eigene Version des Autoloaders, da einheitliche Standards fehlten. PHP brauchte offensichtlich dringend einen Standard für den Autoloader, und so wurde PSR-0 geboren. Der neueste akzeptierte Autoloader-Standard ist PSR-4.
PSR-0 (Autoloading-Standard)
Überblick über PSR-0:
- Ein vollständig qualifizierter Namespace und eine Klasse müssen die folgende Struktur haben:
\<Herstellername>\(<Namespace>\)*<Klassenname> - Jeder Namespace muss einen Top-Level-Namespace („Vendor Name“) haben.
- Jeder Namespace kann beliebig viele Sub-Namespaces haben.
- Jedes Namensraumtrennzeichen wird beim Laden aus dem Dateisystem in einen DIRECTORY_SEPARATOR umgewandelt.
- Jedes _-Zeichen im KLASSENNAMEN wird in ein DIRECTORY_SEPARATOR umgewandelt. Das Zeichen _ hat im Namensraum keine besondere Bedeutung.
- Der vollqualifizierte Namespace und die Klasse werden beim Laden aus dem Dateisystem mit .php angehängt.
- Alphabetische Zeichen in Herstellernamen, Namespaces und Klassennamen können eine beliebige Kombination aus Klein- und Großbuchstaben sein.
Beispiele:
\Doctrine\Common\IsolatedClassLoader =>
/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request =>
/path/to/project/lib/vendor/Symfony/Core/Request.php
PSR-4 (Autoloading-Standard)
Überblick über PSR-4:
- Der Begriff „Klasse“ bezieht sich auf Klassen, Schnittstellen, Merkmale und andere ähnliche Strukturen.
- Ein vollqualifizierter Klassenname hat die folgende Form:
\<NamespaceName>(\<SubNamespaceNames>)*\<Klassenname> - Der vollqualifizierte Klassenname MUSS einen Namespace-Namen der obersten Ebene haben, der auch als „Vendor-Namespace“ bekannt ist.
- Der vollqualifizierte Klassenname KANN einen oder mehrere Unternamensraumnamen haben.
- Der vollqualifizierte Klassenname MUSS einen abschließenden Klassennamen haben.
- Unterstriche haben in keinem Teil des vollqualifizierten Klassennamens eine besondere Bedeutung.
- Alphabetische Zeichen im vollqualifizierten Klassennamen KÖNNEN eine beliebige Kombination aus Klein- und Großbuchstaben sein.
- Bei allen Klassennamen MUSS die Groß-/Kleinschreibung beachtet werden.
Beispiel für PSR-4-basiertes Autoloading mit Composer:
- Betrachten Sie die folgende Verzeichnisstruktur, um PSR-4-basiertes Autoloading mit Composer zu erreichen.

- Erstellen Sie eine Composer.json-Datei mit Composer init. Wenn nicht, können Sie jetzt manuell einen im Stammverzeichnis Ihres Projekts erstellen.

- Richten Sie das automatische Laden von PSR4 ein, indem Sie die Datei composer.json wie unten gezeigt bearbeiten:

- Hier ist CodeCourse ein Herstellername Ihrer Anwendung. Sie können diesen Namen verwenden, während Sie Dateien in Ihrem src-Verzeichnis benennen, wie zum Beispiel:

Oder


etc,
- Und src ist das Verzeichnis Ihrer Anwendung, das Sie automatisch laden möchten.
- Öffnen Sie als Nächstes Ihr Terminal und geben Sie den folgenden Befehl ein, um Autoloading-Dateien in Ihrem Projekt zu installieren. Dadurch werden das Vendor-Verzeichnis und die darin enthaltene Datei autoload.php generiert.

- Lassen Sie uns zunächst ein paar Klassen im CodeCourse-Verzeichnis erstellen.
Erstellen Sie AuthFilters.php in CodeCourse/Filters

Erstellen Sie UserRepository.php in CodeCourse/Repositories

- Erstellen Sie abschließend eine index.php-Datei, um sie zu testen, und fordern Sie einmal die Datei autoload.php einmal in Ihre index.php-Datei an.

PSR-1 & PSR-2
PSR-1 und PSR-2 sind für PHP-Codierungsstandards nützlich. PSR-1 konzentriert sich hauptsächlich auf den grundlegenden Codierungsstandard für PHP, während PSR-2 eher eine erweiterte Version von PSR-1 ist. PSR-1 listet eine Reihe einfacher Regeln für Namenskonventionen auf und PSR-2 bietet einen umfassenderen Code-Styleguide.
PSR-1 (Basiscodierungsstandard)
Überblick über PSR-1:
- Für PHP-Tags sind nur <?php oder <?= erlaubt.
- Klassennamen müssen in UpperCamelCase definiert werden.
- Klassenvariablen müssen in camelCase definiert werden.
- Klassenkonstanten müssen in UPPER_SNAKE_CASE definiert werden.
- Methodennamen müssen in camelCase definiert werden.
- Dateien SOLLTEN entweder Symbole deklarieren (Klassen, Funktionen, Konstanten usw.) oder Nebenwirkungen verursachen (zB Ausgabe generieren, .ini-Einstellungen ändern usw.), aber NICHT beides. Dh,

Das obige Beispiel verursacht einen Nebeneffekt, dh das Laden einer Datei namens „file.php“.
- Dateien müssen in UTF-8 ohne BOM (Byte Order Mark) vorliegen.
- Namensräume und Klassennamen müssen den Standards in PSR-0 und PSR-4 entsprechen.
Hier ist ein Beispiel, das die grundlegenden Namenskonventionen für Eigenschaften, Klassen und Methoden veranschaulicht.

PSR-2 (Coding Style Guide)
Überblick über PSR-2:
- Sie müssen die PSR-1-Codierungsstandards befolgen.
- Für Einrückungen müssen 4 Leerzeichen verwendet werden. Die Verwendung von Registerkarten ist nicht zulässig.
- Die Zeilenlänge ist nicht begrenzt, sollte jedoch unter 120 Zeichen liegen, am besten unter 80.
- Nach der Namensraumdeklaration muss eine Leerzeile stehen und nach der Verwendungsblock-Deklaration muss eine Leerzeile stehen.
- Öffnende geschweifte Klammern für Klassen und Methoden müssen in der nächsten Zeile stehen und schließende geschweifte Klammern müssen in der Zeile nach dem Rumpf stehen.
- Methoden und Eigenschaften müssen zuerst mit abstract/final, gefolgt von public/protected und zuletzt mit static definiert werden.
- Sie dürfen in bedingten Anweisungen keinen Zeilenumbruch vor geschweifte Klammern setzen.
- In bedingten Anweisungen dürfen keine Leerzeichen vor ( und ) stehen.
- Ein Beispiel für die Definition von Klassen:
- Sie müssen die geschweiften Klammern in der neuen Zeile öffnen und die Schlüsselworte extensions und implements müssen in einer einzigen Zeile verwendet werden.

Wenn mehrere Schnittstellen implementiert werden müssen, können Sie die Schnittstellennamen wie folgt in die neue Zeile schreiben:

Beispiel, um zu zeigen, wie Methoden in PHP definiert werden:
Beim Definieren der Methoden sollten die Argumente in dieselbe Zeile geschrieben werden. Außerdem dürfen Sie in Argumenten keine Leerzeichen vor Kommas setzen, und Sie müssen dahinter ein Leerzeichen setzen.

Wenn viele Argumente vorhanden sind, können sie nacheinander in Newline geschrieben werden:

Beim Definieren von Methoden müssen Sie entweder öffentlich/geschützt/privat oder abstrakt/final haben. Die Sichtbarkeitsmodi kommen nach dem abstrakten/finalen Schlüsselwort, falls verwendet. static ist der letzte Modifikator.

Bedingte Anweisungen
- Sie müssen ein Leerzeichen vor (
- Sie dürfen keine Leerzeichen hinter (
- Sie dürfen keine Leerzeichen davor setzen )
- Sie müssen nach ) ein Leerzeichen einfügen.
- Verwenden Sie elseif statt else if.
Beispiel für den Unterschied zwischen elseif und else if:
Interpretation von elseif:

Interpretation von else if:

Für die switch-Anweisungen
- Die geschweiften Klammern müssen in derselben Zeile geöffnet werden, in der die switch-Anweisung geschrieben wird.
- Der Gehäusekörper muss einmal aus dem Gehäuse eingerückt werden und das Gehäuse muss einmal aus dem Schalter eingerückt werden.
- Verwenden Sie keine Pause, wenn keine Pause erforderlich ist.
- Sie können auch return anstelle von break verwenden.
Beispiel:
