PHP-Namespaces in WordPress – ein No-Nonsense-Guide

Veröffentlicht: 2018-10-16

PHP-Namespaces sind fast zehn Jahre alt. Ja, ein Jahrzehnt ist vergangen (und ja, du wirst alt). Obwohl seit der Veröffentlichung von PHP v5.3 ein Jahrzehnt vergangen ist, haben viele Entwickler immer noch kein grundlegendes Verständnis von Namespaces. Um ehrlich zu sein, verwendet WordPress keine Namespaces , also „ müssen Sie nicht wissen, wie man Namespaces verwendet, wenn Sie nur mit WordPress arbeiten “. Sie müssen kein Namespace-Ninja sein, aber die Grundlagen zu verstehen ist einfach und tut gut.

PHP-Namespaces gibt es seit einem Jahrzehnt, und Sie verwenden sie immer noch nicht, weil #wordpress dies auch nicht tut? Lesen und verwenden Sie sie in 2 Minuten! #Entwicklung

KLICKEN, UM ZU TWEETEN

Wenn es keine Namespace-Unterstützung gibt – verwenden Sie ein Präfix

Lange Zeit hatte PHP keine native Namespace-Unterstützung. Aus diesem Grund verwenden WordPress und viele andere große Codebasen keine nativen Namespaces. Sie waren nicht da, wenn sie gebraucht wurden, also werden Präfixe verwendet.

Namensräume sind wichtig, weil sie sicherstellen, dass Ihre Funktion write_to_log() nicht bereits durch einen anderen Codeabschnitt definiert wurde. Um Namenskonflikte zu vermeiden, benötigt alles im globalen Bereich ein Präfix, sodass die Funktion zu awesome_project_write_to_log() wird und alle anderen Funktionen und Variablen auch das Präfix awesome_project_ erhalten. Einfach? Es ist! Hübsch? Nicht genau.

Es gibt einige Alternativen zu diesem Ansatz, wie die Kapselung statischer Methoden. Sie packen alle Ihre Funktionen in eine Klasse und deklarieren sie als statische Methoden. Anstatt my_function() aufzurufen, rufen Sie dann My_Class::my_function() . Besser? Ein bisschen, aber immer noch kein richtiger Namespace.

Sehen wir uns an, wie Namensräume es mehreren Codeteilen (oder Paketen, wenn Sie möchten) ermöglichen, dieselben Klassen- und Funktionsnamen ohne Konflikte zu verwenden. Oder wie das PHP-Handbuch sagt – wie sie die Code-Kapselung ermöglichen. Ihre Analogie zu Dateien und Ordnern ist ebenfalls genau richtig – Namespaces verhalten sich in vielerlei Hinsicht genau wie Ordner, also kopiere/füge ich aus dem Handbuch;

In jedem Betriebssystem dienen Verzeichnisse dazu, zusammengehörige Dateien zu gruppieren und als Namensraum für die darin enthaltenen Dateien zu fungieren. Beispielsweise kann die Datei foo.txt sowohl im Verzeichnis /home/greg als auch in /home/other existieren, aber zwei Kopien von foo.txt können nicht gleichzeitig im selben Verzeichnis existieren. Um auf die Datei foo.txt außerhalb des Verzeichnisses /home/greg zuzugreifen, müssen wir den vollständigen Verzeichnisnamen dem Dateinamen voranstellen, indem wir das Verzeichnistrennzeichen verwenden, um /home/greg/foo.txt zu erhalten.

Namensräume deklarieren – erinnern Sie sich an die erste Zeile

Das Schlüsselwort namespace muss die erste Codezeile in der Datei sein (ohne Kommentare und Nicht-PHP-Inhalte). Namensräume wirken sich nur auf Klassen, Schnittstellen, Funktionen und Konstanten aus. Sie wirken sich nicht auf Variablen aus. Sie können denselben Namespace in mehreren Dateien definieren, sodass Sie Code in mehrere Dateien aufteilen können. Sub-Namespaces ermöglichen das Definieren einer Hierarchie in Namespaces ähnlich wie in Ordnern durch die Verwendung eines umgekehrten Schrägstrichs – namespace myproject\level1\level2 . Das sind grundlegende und fast alle Regeln für die Deklaration von Namespaces.

// file-A.php contains a function under the myCompany\PackageA namespace
namespace myCompany\PackageA;
 
function do_something() {
  // do things
}
// file-B.php contains a function with the same name
// but under a different namespace
namespace myCompany\PackageB;
 
function do_something() {
  // do things
}

Obwohl dies möglich ist, würde ich dringend empfehlen, nicht mehrere Namespaces in einer einzigen Datei zu kombinieren. Vertrauen Sie mir, früher oder später werden Sie vergessen, dass Sie es getan haben, und dann dauert das Debuggen eines 2-minütigen Fehlers zwei Stunden. Wenn Sie jedoch müssen, hier ist die Syntax.

// do not put multiple namespace declarations into the same file
// but if you must, here's the syntax

namespace MyFirstProject {
  const CONST = true;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
}

namespace MySecondProject {
  const CONST = true;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
}

// any code after this has to go in the global namespace
namespace {
  $some_var = 1;
  function_in_global_namespace();
}

Verwendung von Namensräumen – merken Sie sich Ordner

Wie ich bereits sagte – Namensräume sind Ordnern sehr ähnlich. Angenommen, die Datei foo.txt befindet sich in Ihrem aktuellen Ordner; Sie können es mit einer einfachen foo.txt . Wenn Sie sich eine Ebene über dem Ordner mit der Datei foo.txt , müssen Sie einen relativen Pfad ../foo.txt oder einen absoluten Pfad /folder1/folder2/foo.txt . Nichts Besonderes. Namespaces verwenden das gleiche Paradigma.

// remember after declaring a namespace
// all our code is in it; like when you're working in a folder
namespace mycompany\project;

function foo() {}
class foo {
  static function staticmethod() {}
}

// resolves to mycompany\project\foo() because of line #3
foo();

// likewise, resolves to mycompany\project\foo::staticmethod()
foo::staticmethod();

// constant are affected by namespaces too
// so we're working with mycompany\project\FOO
echo FOO;

// this is a relative path
// resolves to mycompany\project\subnamespace\foo()
subnamespace\foo();

// static methods are no different
// mycompany\project\subnamespace\foo::staticmethod()
subnamespace\foo::staticmethod();
                                 
// a full namespace path starts with a backslash
// it resolves exactly to what it says it does
\otherNamespace\Bar\foo();

// again same thing for a constant, full path nothing magical
echo \otherNamespace\Bar\FOO;

Schauen Sie sich das Schlüsselwort use im PHP-Handbuch an – Beispiele sind großartig. Es bietet eine Möglichkeit, Code aus anderen PHP-Namespaces in den aktuellen Namespace zu importieren oder mit einem Alias ​​auf einen externen (vollständig qualifizierten) Namen zu verweisen.

Ja, Sie brauchen Namensräume und sollten sie verwenden

Wie es mehr als offensichtlich ist, wenn man sich den Quellcode von WordPress ansieht, müssen Sie keine Namensräume verwenden, aber Sie müssen eine Methode zur Namensraumbildung verwenden. Präfixierung mit wp_ im Fall von WP. Wenn wir es also bereits tun, warum tun wir es nicht richtig?

Namespaces in PHP lassen sich problemlos in jeden Entwicklungsworkflow integrieren. Sie erleichtern das automatische Laden, die Dateibenennung und machen den Code im Allgemeinen sauberer. Das Umgestalten von altem Code ist nie eine beliebte Aufgabe (unabhängig von der Programmiersprache), daher werde ich Ihnen nicht sagen, dass Sie ein funktionierendes 2-MB-Projekt umgestalten sollen, nur damit Sie sagen können, dass Sie Namespaces verwenden. Ich werde jedoch darauf bestehen, dass Sie Namespaces verwenden, wenn Sie an neuen Projekten arbeiten. Du wirst dir bald genug danken.

Die offizielle PHP-Dokumentation zu Namespaces ist mehr als exzellent! Codebeispiele sind sauber und Kommentare aus der Praxis hilfreich. Durchsuchen Sie es unbedingt, auch wenn Sie denken, dass Sie es nicht brauchen.