Beyond Prefixing: Ein WordPress-Entwicklerhandbuch zu PHP-Namespaces
Veröffentlicht: 2019-11-12Alles voranstellen.
Es ist ein Sprichwort, das so alt ist wie die WordPress-Software selbst. Das Präfixieren ist schon so lange ein Standard für WordPress-Entwickler, dass es schwer vorstellbar ist, etwas anderes zu machen. Aber die Zeit ist reif für etwas Neues. Nun, es ist längst überfällig, aber WordPress hinkt den Standardpraktiken in der größeren PHP-Welt etwas hinterher.
Das Präfixieren ist die Praxis, eine Code-freundliche Version Ihres Projektnamens zu erstellen und ihn vor Funktionen, Klassen und andere Dinge im globalen Namespace zu kleben. Beispielsweise würden Sie eine Funktion tavern_get_post() anstelle von get_post() , um Konflikte mit Funktionsnamen zu vermeiden, die zu einem schwerwiegenden Fehler führen würden.
Das Präfixieren ist eine Form des „Namensraums“, was nur eine ausgefallene Art zu sagen ist, dass Namen in diesem Bereich zu einem bestimmten Projekt gehören. Das Präfixing (und das Suffixing, das weniger verbreitet ist) ist jedoch ein Hack aus einer Zeit, als es keine Lösung für die PHP-Sprache gab.
Mit PHP 5.3 wurde eine offizielle Methode zum Namespacen eingeführt, der Standard existiert also seit Jahren. Da WordPress 5.2 die PHP-Mindestanforderung auf 5.6 erhöht hat, ist es an der Zeit, dass Entwickler ihre alten Gewohnheiten ablegen und zum Rest der PHP-Welt aufschließen.
Namespace (fast) alles
Der PHP-Namespace deckt nur die folgenden Elemente ab.
- Klassen
- Schnittstellen
- Züge
- Funktionen
- Mit dem Schlüsselwort
constdeklarierte Konstanten, aber nichtdefine()
Wenn es um Skript-Handles, Bildgrößennamen, Datenbankoptionen und andere Elemente im globalen Namensraum geht, müssen Sie ihnen immer noch ein Präfix voranstellen. Das sind IDs und außerhalb des Bereichs des PHP-Namensraums.
So erstellen Sie Namensräume
Namespaces sind einfach zu deklarieren. Deklarieren Sie am Anfang jeder PHP-Datei, für die Sie einen bestimmten Namespace verwenden möchten, diesen wie im folgenden Code-Snippet gezeigt.
<?php Namensraum Taverne;
Diese Codezeile deklariert, dass alles in dieser bestimmten Datei den Namensraum Tavern hat.
Schauen Sie sich eine einfache Funktion unter diesem Namensraum an, um ein Hello, World! Botschaft.
<?php
Namensraum Taverne;
Funktion hallo () {
_e( 'Hallo, Welt!', 'Beispiel-Textdomain' );
} Nach den alten Präfixregeln hätte hello() den Namen tavern_hello() . Dies ist jedoch bei Namespaces nicht der Fall. Die Funktion hello() ist im Namensraum Tavern eingekapselt und steht nicht mit anderen Funktionen namens hello() in Konflikt.
Klassen und Schnittstellen funktionieren genauso wie Funktionen. Mit einem Klassennamen von Article könnte die Klassendatei wie folgt aussehen.
<?php
Namensraum Taverne;
Klasse Artikel {
// ...
}Hinweis: Es sollte immer nur eine Klasse oder Schnittstelle pro Datei geben. Dies ist besonders wichtig, wenn Sie jemals vorhaben, einen Autoloader zu verwenden.
So benennen Sie Namensräume
Entwickler streiten gerne darüber, wie man Dinge benennt, und es gibt keine Einheitslösung. Die wichtigste Regel ist, eindeutig zu sein, um Konflikte mit Code aus anderen Projekten zu vermeiden. Eine der besten Möglichkeiten, dies zu tun, besteht darin, einen Vendor -Namespace der obersten Ebene mit einem Package -Sub-Namespace zu verwenden.
Angenommen, der Namensraum des Anbieters war Tavern und das fragliche Projekt war ein WordPress-Design mit dem Namen News . Der Namespace für das Projekt könnte wie folgt aussehen.
<?php Namensraum Tavern\News;
Das mag für manche Entwickler etwas ausführlich sein. Wenn der Name Ihres Projekts bereits ziemlich eindeutig ist, z. B. „Awesomesauce“, möchten Sie vielleicht einfach Folgendes verwenden.
<?php Namensraum Awesomesauce;
Sie sollten sich zumindest eine Art Standardkonvention einfallen lassen. Irgendwann möchten Sie sich mit Dingen wie dem automatischen Laden befassen, daher ist es hilfreich, ein System zu haben, dem Sie in all Ihren Projekten folgen. Fühlen Sie sich frei, den PHP-FIG Autoloader-Standard zu lesen.
Importieren von Klassen und Funktionen in einen anderen Namespace
Wenn Sie eine Klasse oder Funktion aus einem anderen Namespace als dem aktuellen Namespace verwenden müssen, müssen Sie sie importieren. Dies geschieht über das Schlüsselwort use in PHP.

Die use -Anweisung muss nach der namespace Deklaration kommen. Es sollte auch auf den vollständig qualifizierten Klassennamen verweisen. Der folgende Code importiert die Tavern\Helpers\Post -Klasse in eine Datei mit einem anderen Namespace.
<?php Namensraum Tavern\Template; Verwenden Sie Tavern\Helpers\Post;
Sobald es importiert ist, können Sie die Post -Klasse sicher direkt verwenden, wie im nächsten Codeausschnitt gezeigt.
$post = neuer Post();
Ab PHP 5.6 können Sie auch Funktionen und Konstanten aus anderen Namensräumen mit den Schlüsselwörtern use function bzw. use const importieren. Der folgende Codeblock zeigt, wie Sie sowohl eine Funktion als auch eine Konstante importieren.
<?php Namensraum Tavern\Template; benutze die Funktion Tavern\Helpers\func_name; benutze const Tavern\Helpers\CONSTANT_NAME;
Aliasing-Klassen und -Funktionen
Schließlich werden Sie in eine Situation geraten, in der Sie eine Klasse oder Funktion importieren müssen, die denselben Namen wie eine Klasse oder Funktion im aktuellen Namespace hat. Sie denken vielleicht, dass dies das Problem ist, das Namespaces lösen sollten. Glücklicherweise bietet PHP eine Methode zum Erstellen eines Alias beim Import.
Angenommen, Sie haben eine Klasse mit dem Namen Tavern\User und müssen die Schnittstelle Tavern\Contracts\User implementieren. Beim Importieren der Schnittstelle müssen Sie einen Alias erstellen, wie unten gezeigt.
<?php
Namensraum Taverne;
verwenden Sie Tavern\Contracts\User als UserContract;
Klasse Benutzer implementiert UserContract {
// ...
} Das an das Ende der use -Anweisung angehängte as UserContract erstellt einen Alias für die User . Sie können den neuen UserContract Namen sicher und fehlerfrei verwenden.
Klassen, Schnittstellen, Funktionen und Konstanten folgen alle derselben Methode zum Erstellen eines Alias.
Organisieren der Ordnerstruktur basierend auf Namespaces
In der weiteren PHP-Welt ist es üblich, dass Namespaces und die Datei- und Ordnerstruktur des Projekts übereinstimmen. Dadurch können andere Entwickler den Code in Ihrem Projekt leicht finden. Es macht es auch einfach, Autoloader zum Laden von Klassen nach Bedarf zu bauen.
Im Allgemeinen sollte der gesamte PHP-Code in einem /src , /inc oder einem ähnlich benannten Ordner in Ihrem Projekt abgelegt werden. Eine beispielhafte Plugin-Datei und Ordnerstruktur könnte wie folgt aussehen.
/plugin-name
/src
/Kern
/Activate.php
/Setup.php
/Aussicht
/Post.php
/Seite.php Wenn Sie der gleichen Struktur mit Namensräumen folgen, würden die obigen .php Dateien die folgenden Klassen enthalten.
-
Tavern\Core\Activate -
Tavern\Core\Setup -
Tavern\View\Post -
Tavern\View\Page
Beachten Sie, dass bei Datei- und Ordnernamen zwischen Groß- und Kleinschreibung unterschieden wird und sie genau mit dem Namespace und dem Klassennamen übereinstimmen sollten.
Natürlich steht es Ihnen frei, jeder Konvention zu folgen, die Sie möchten. Die vorstehende Empfehlung ist jedoch eine gute Praxis und wird Ihnen die Organisation Ihrer Projekte langfristig erleichtern.
Vorteile der Verwendung von Namespaces
Der offensichtlichste Vorteil besteht darin, Konflikte zwischen Klassen und Funktionen mit demselben Namen zu vermeiden. Sie sollten echte Namensräume aus dem gleichen Grund verwenden, aus dem Sie Präfixe verwendet haben.
Namespaces helfen, lange Klassennamen zu vermeiden. Das Eingeben langer Namen in einem großen Projekt ist bestenfalls eine mühsame Übung.
Einfacheres Wechseln von Implementierungen durch Importieren. Sobald Sie den Dreh raus haben, Klassen und Schnittstellen aus anderen Namespaces zu importieren, können Sie eine Implementierung einer Schnittstelle mit einer einzigen Codezeile wechseln.
Das automatische Laden von Klassen ist viel einfacher, wenn Sie dem PSR-4: Autoloader-Standard folgen, der mindestens einen Namespace der obersten Ebene erfordert.
Für Entwickler im professionellen Bereich erwerben Sie eine marktfähige Fähigkeit, die über das WordPress-Ökosystem hinausgeht. Es wird Ihnen schwer fallen, PHP-Entwicklungsarbeit zu finden, wenn Sie nicht wissen, wie man Namespaces verwendet. Es ist kein schwer zu verstehendes Konzept, aber in der Praxis kann es für einige eine Lernkurve geben.
