Namensraum in PHP

In Bezug auf die Namespace-Unterstützung in PHP war dies ein holpriger Weg. Zum Glück wurde es in PHP 5.3 zur Sprache hinzugefügt, und die anwendbare Struktur von PHP-Code hat sich seitdem stark verbessert. Aber wie verwenden wir sie genau??


Was ist ein Namespace??

"Vergessen Sie nicht, den Backslash zu umgehen, wenn Sie einen Namespace-Namen in einer Zeichenfolge speichern!"

Stellen Sie sich einen Namensraum als Schublade vor, in den Sie alle möglichen Dinge einfügen können: einen Bleistift, ein Lineal, ein Stück Papier und so weiter. Das sind deine Sachen. Direkt unter Ihrer Schublade befindet sich eine andere, und er legt die gleichen Sachen hinein. Um zu vermeiden, dass die Gegenstände des anderen verwendet werden, beschließen Sie, die Schubladen so zu kennzeichnen, dass klar ist, wer wem gehört.

Bisher mussten Entwickler in ihren Klassen, Funktionen und Konstanten Unterstriche verwenden, um die Codebasis voneinander zu trennen. Das ist gleichbedeutend damit, die Habseligkeiten des jeweils anderen zu kennzeichnen und in eine große Schublade zu legen. Sicher, es ist zumindest eine Art Organisation, aber sehr ineffizient.

Namensraum zur Rettung! Sie können dieselben Funktions-, Klassen-, Schnittstellen- und Konstantendefinitionen in separaten Namespaces deklarieren, ohne schwerwiegende Fehler zu erhalten. Ein Namespace ist nichts weiter als ein hierarchisch gekennzeichneter Codeblock, der regulären PHP-Code enthält.

Sie benutzen sie!

Beachten Sie, dass Sie Namespaces indirekt verwenden. ab PHP 5.3 fallen alle Definitionen, die noch nicht in einem benutzerdefinierten Namespace deklariert sind, unter den globalen Namespace.

Der globale Namespace enthält auch alle internen PHP-Definitionen, z Echo(), mysqli_connect (), und das Ausnahme Klasse. Da der globale Namespace über keinen eindeutigen identifizierenden Namen verfügt, wird der häufigste Name als " globaler raum.

Beachten Sie, dass es keine Verpflichtung ist, Namespaces zu verwenden.

Ihr PHP-Skript wird ohne sie einwandfrei funktionieren, und dieses Verhalten wird sich nicht sehr bald ändern.


Namensraum definieren

Eine Namespace-Definition ist die erste Anweisung, die der PHP-Interpreter in einer PHP-Datei finden sollte. Die einzige Anweisung, die über einer Namespace-Deklaration auftreten darf, ist a erklären Anweisung, und nur dann, wenn sie die Kodierung des Skripts deklariert.

Das Deklarieren eines Namespaces ist so einfach wie das Verwenden von Namespace Stichwort. Ein Namespace-Name sollte denselben Regeln wie andere Bezeichner in PHP entsprechen. Daher muss ein Namespace vorhanden sein Beginnen Sie mit einem Buchstaben oder Unterstrich, gefolgt von einer beliebigen Anzahl von Buchstaben, Zahlen oder Unterstrichen.

 

Wenn Sie dem globalen Bereich einen Codeblock zuordnen möchten, verwenden Sie den Namespace Schlüsselwort, ohne einen Namen anzufügen.

 

Sie dürfen mehrere Namespaces in derselben Datei haben.

 

Sie können den gleichen Namespace auch auf verschiedene Dateien verteilen. Beim Einbeziehen von Dateien werden diese automatisch zusammengeführt. Daher ist es eine gute Kodierungspraxis, die Anzahl der Namespace-Definitionen auf eine pro Datei zu begrenzen, genau wie Sie es mit Klassen tun würden.

Namespacing wird verwendet, um widersprüchliche Definitionen zu vermeiden und mehr Flexibilität und Organisation in Ihre Codebasis einzuführen.

Beachten Sie, dass die Klammern um den Namespace-Codeblock vollständig optional sind. Wenn Sie sich an die One-Namespace-per-File-Regel halten und die geschweiften Klammern weglassen, wird Ihr Code wesentlich sauberer - der verschachtelte Code muss nicht eingerückt werden.

Sub-Namespaces

Namespaces können einer bestimmten Hierarchie folgen, ähnlich wie die Verzeichnisse im Dateisystem Ihres Computers. Sub-Namespaces sind äußerst nützlich, um die Struktur eines Projekts zu organisieren. Wenn für Ihr Projekt beispielsweise Datenbankzugriff erforderlich ist, möchten Sie möglicherweise den gesamten datenbankbezogenen Code, z. B. eine Datenbankausnahme und einen Verbindungshandler, in einen aufgerufenen Sub-Namespace einfügen Datenbank.

Um die Flexibilität zu wahren, ist es ratsam, Sub-Namespaces in Unterverzeichnissen zu speichern. Dies fördert die Strukturierung Ihres Projekts und vereinfacht die Verwendung von Autoloadern, die dem PSR-0-Standard entsprechen.

PHP verwendet die Backslash als sein Namensraum-Trennzeichen.


Interessante Tatsache: Um zu entscheiden, welches Namensraum-Trennzeichen verwendet werden soll, wurde im RFC sogar ein Smiley in Betracht gezogen.
// Mein Projekt / Datenbank / Verbindung.php  

Sie können beliebig viele Sub-Namespaces einrichten.

 

Das Definieren von Sub-Namespaces mit geschachtelten Codeblöcken wird nicht unterstützt. Das folgende Beispiel wirft einen sehr beschreibenden schwerwiegenden Fehler ab: "Namespace-Deklarationen können nicht geschachtelt werden".

 

Code aus einem Namespace aufrufen

Wenn Sie ein neues Objekt instanziieren möchten, eine Funktion aufrufen oder eine Konstante aus einem anderen Namespace verwenden, verwenden Sie die Backslash-Notation. Sie können aus drei verschiedenen Gesichtspunkten aufgelöst werden:

  • Unqualifizierter Name
  • Qualifizierter Name
  • Vollständig qualifizierter Name

Unqualifizierter Name

Dies ist der Name einer Klasse, einer Funktion oder einer Konstante, ohne einen Bezug zu einem beliebigen Namespace aufzunehmen. Wenn Sie mit dem Namensraum noch nicht vertraut sind, ist dies der Ansichtspunkt, an den Sie gewöhnt sind.

 

Qualifizierter Name

So greifen wir auf die Sub-Namespace-Hierarchie zu. Es verwendet die Backslash-Notation.

 

Das folgende Beispiel löst einen schwerwiegenden Fehler aus: "Schwerwiegender Fehler: Klasse 'MyProject \ Database \ MyProject \ FileAccess \ Input' nicht gefunden", weil MeinProjekt \ FileAccess \ Input wird relativ zu dem Namensraum angesprochen, in dem Sie sich gerade befinden.

 

Vollständig qualifizierter Name

Die nicht qualifizierten und qualifizierten Namen beziehen sich beide auf den aktuellen Namespace. Sie können nur verwendet werden, um auf Definitionen auf dieser Ebene zuzugreifen oder tiefer in die Namespace-Hierarchie einzutauchen.

Wenn Sie auf eine Funktion, Klasse oder Konstante zugreifen möchten, die sich auf einer höheren Ebene in der Hierarchie befindet, müssen Sie den vollständig qualifizierten Namen verwenden - einen absoluten Pfad und nicht einen relativen. Dies bedeutet, dass Sie Ihren Anruf mit einem Backslash voranstellen. Dadurch weiß PHP, dass dieser Aufruf aus dem globalen Bereich heraus aufgelöst werden sollte, anstatt sich relativ zu ihm zu nähern.

 

Es ist nicht erforderlich, den vollständig qualifizierten Namen interner PHP-Funktionen zu verwenden. Einen anrufen unqualifizierter Name Für eine Konstante oder Funktion, die nicht im Namespace vorhanden ist, in der Sie gerade arbeiten, werden in PHP Ergebnisse in dem globalen Namespace nach ihnen gesucht. Dies ist ein integrierter Fallback, der nicht für unqualifizierte Klassennamen gilt.

Aus diesem Grund können wir jetzt interne PHP-Funktionen überladen und gleichzeitig die ursprüngliche Funktion (oder Konstante) aufrufen..

'; 

Dynamische Anrufe

PHP ist eine dynamische Programmiersprache. Sie können diese Funktion auch für den Aufruf von Code mit Namensbereich verwenden. Dies ist im Wesentlichen dasselbe wie das Instanziieren von Variablenklassen oder das Einfügen von Variablendateien. Das von PHP verwendete Namespace-Trennzeichen ist auch ein Metazeichen in Strings. Vergessen Sie nicht, den Backslash zu umgehen, wenn Sie einen Namespace-Namen in einer Zeichenfolge speichern!

 

Das Namespace Stichwort

Das ist nicht nur das Namespace Mit diesem Schlüsselwort kann ein Namespace definiert werden. Er kann auch explizit in den aktuellen Namespace aufgelöst werden, funktional ähnlich wie der selbst Schlüsselwort für Klassen.

 

Das __NAMESPACE__ Konstante

Ähnlich wie das selbst Mit dem Schlüsselwort kann nicht ermittelt werden, wie der aktuelle Klassenname lautet Namespace Schlüsselwort kann nicht verwendet werden, um den aktuellen Namespace zu ermitteln. Deshalb haben wir die __NAMESPACE__ Konstante.

 

Diese Konstante ist sehr nützlich für das Lernen, wenn Sie gerade mit Namespaces beginnen. Es ist auch hilfreich beim Debuggen. Da es sich um einen String handelt, kann er auch in Kombination mit dynamischen Codeaufrufen verwendet werden, die wir zuvor beschrieben haben.


Aliasing oder Importieren

"Es ist keine Verpflichtung, Namespacing zu verwenden"

Namespacing in PHP unterstützt importieren. Importieren wird auch als bezeichnet Aliasing. Nur Klassen, Interfaces und Namespaces können als Aliasnamen importiert werden.

Das Importieren ist ein sehr nützlicher und grundlegender Aspekt des Namensraums. Es gibt Ihnen die Möglichkeit, externe Code-Pakete wie Bibliotheken zu verwenden, ohne sich um konfliktierende Namen kümmern zu müssen. Das Importieren erfolgt mit der benutzen Stichwort. Optional können Sie einen benutzerdefinierten Alias ​​mit angeben wie Stichwort.

Verwenden Sie [Name der Klasse, des Interfaces oder des Namespaces] als [optional_custom_alias].

Wie es gemacht wird

Ein vollständig qualifizierter Name kann mit einem kürzeren nicht qualifizierten Namen versehen werden, so dass Sie ihn nicht jedes Mal schreiben müssen, wenn Sie ihn verwenden möchten. Aliasing oder Import sollten im höchsten Bereich eines Namespaces oder im globalen Bereich erfolgen. Der Versuch, dies im Rahmen einer Methode oder Funktion auszuführen, ist eine ungültige Syntax.

 

Alternativ können Sie einen anderen Namen als Alias ​​verwenden:

 

Sie können auch globale Klassen wie die importieren Ausnahme Klasse. Nach dem Import müssen Sie nicht mehr den vollständig qualifizierten Namen schreiben.

Beachten Sie, dass Importnamen nicht relativ zum aktuellen Namespace aufgelöst werden, sondern vom absoluten Standpunkt ausgehend vom globalen Bereich. Dies bedeutet, dass ein führender Backslash nicht erforderlich ist und nicht empfohlen wird.

 

Zwar ist es möglich, Namespace-Code dynamisch aufzurufen, das dynamische Importieren wird jedoch nicht unterstützt.

 

Fazit

Namespacing wird verwendet, um widersprüchliche Definitionen zu vermeiden und mehr Flexibilität und Organisation in Ihre Codebasis einzuführen. Denken Sie daran, dass Sie nicht verpflichtet sind, Namespaces zu verwenden. Es ist eine Funktion, die in Kombination mit einem objektorientierten Workflow verwendet wird. Hoffentlich werden Sie jedoch erwägen, Ihr (zukünftiges) PHP-Projekt auf die nächste Stufe zu bringen, indem Sie den Namensraum verwenden. Hast du dich bereits entschieden?