Sprache:

Suche

Was sind Namespaces in PHP?

  • Teilen:
Was sind Namespaces in PHP?

Einführung

Auf den ersten Blick mögen Namespaces etwas unnötig oder auch etwas kompliziert erscheinen. Tatsächlich ist das Konzept von Namespaces aber sehr einfach. Namespaces helfen tatsächlich dabei, Ihren Code zu organisieren und Namenskonflikte innerhalb der Codebasis Ihres Projekts zu vermeiden.

In diesem kurzen Artikel gehen wir darauf ein, wie und wann man Namespaces in seinem Projekt verwendet, wie man psr-4 in seinem Projekt implementiert und wie man sie automatisch einbindet.

Lesen Sie auch: PSR 4 Autoloading von PHP-Dateien mit Composer

Grundlegende Projektstruktur

Lassen Sie uns ein neues Projektverzeichnis erstellen und es als understanding-namespaces. Erstellen Sie eine neue Datei namens index.php im Verzeichnis unseres Projekts. Dies ist die Datei, in der wir normalerweise alle Arbeitsdateien nacheinander benötigen, wenn wir an einem einfachen PHP-Projekt arbeiten. Diese Technik wird häufig auch in WordPress verwendet, aber für unser Projekt werden wir einen strukturierteren Ansatz wählen.

Eine einfache Class

Erstellen wir eine neue Klasse FooBar.php und legen sie im Verzeichnis /app/Classes/ ab.

class FooBar {

   public $foo='bar';
}

Wir haben eine öffentliche Eigenschaft erstellt, um unsere Klasse zu testen. Nun wollen wir in unserer index.php diese Klasse instanziieren und unsere neu erstellte Eigenschaft aufrufen.

$foobar = new FooBar();
echo $foobar->foo;

Nun, dies wird eher einen Fehler anzeigen, traditionell müssen Sie die Klasse in Ihrer Datei einmal erfordern & das beinhaltet jede einzelne Datei in einer einzigen Datei erfordern, was zu einem Bündel von require-Anweisungen. ziemlich ein Chaos?

require_once 'app/Classes/FooBar';

$foobar = new FooBar();
echo $foobar->foo;

Lösung

Um dieses Problem zu beheben, können wir für unsere Klasse einen Bezeichner schreiben, der sie von anderen Klassen unterscheidet und beim Einziehen in unsere Hauptdatei nützlich sein kann. Diese Bezeichner werden Namespaces genannt.
Das Namespacing, das wir hier erstellen, steht also in direktem Zusammenhang mit dem Autoloading von psr-4, zu dem wir gleich noch kommen werden.

namespace WebTier\Classes;
class FooBar {

   public $foo='bar';
}

Wir haben gerade das Namespace-Schlüsselwort verwendet, um unseren Namespace zu definieren. WebTier ist wie unser Projekt- oder Anbietername, er kann alles Mögliche sein. Wir beziehen unser App-Verzeichnis hier auf WebTier. Hier wird das automatische Laden von psr-4 seine Rolle spielen.
Dies ist sehr nützlich, um die Namenskonflikte zwischen den Klassen in Ihren Projekten zu minimieren.

Klappt es immer noch nicht?
Nun zurück in unserer index.php, wenn wir require aufrufen und versuchen, die Ausgabe per Echo auszugeben, erscheint die Fehlermeldung Class not found. Was haben wir übersehen? Nun, unser Namespace ist WebTier\Classes und nicht app\Classes. Um dieses Problem zu beheben, verwenden wir das use-Schlüsselwort, um die Klasse wie folgt zu importieren:

use WebTier\Classes\FooBar;
require_once 'app/Classes/FooBar';

$foobar = new FooBar();
echo $foobar->foo;

Damit ist das Problem zwar vorerst gelöst, aber es fehlt immer noch die Funktion des automatischen Ladens, um dieses Problem, das überall Dateien erfordert, ein für alle Mal zu beseitigen.

Das PSR-4

Hoffentlich ist das grundlegende Konzept von Namespacing ein wenig klar. Für das Autoloading werden wir Composer benutzen, um unsere Dateien automatisch einzuladen. Das bedeutet, dass wir auf psr-4 für Namespaces hören werden und dann eine Verzeichnisstruktur erstellen, die es uns erlaubt, Dateien automatisch basierend auf ihrem Namespace zu laden.
Um loszulegen, erstellen wir eine composer.json-Datei im Stammverzeichnis unseres Projekts.

{
    "autoload" : {
        "psr-4" : {
            "WebTier\\" : "app"
        }
    }
}

"autoload" ist im Grunde eine Eigenschaft und psr-4 ist die Art und Weise, wie wir autoload machen wollen. Innerhalb von psr-4 haben wir zwei Dinge:

- Der Top Level Namespace: in unserem Fall WebTier

- Das verweisende Verzeichnis: das ist app

Lesen Sie auch: Array in Objekt umwandeln in PHP

Damit es funktioniert

Öffnen Sie Ihr Terminal und geben Sie den folgenden Befehl ein, um alle unsere Dateien im app-Verzeichnis automatisch zu laden.

composer dump-autoload -o

Dadurch wird ein neues Anbieterverzeichnis in Ihrem Projekt erstellt. Im Moment enthält es nur eine Datei namens autoload.php, die wir in unsere index.php ziehen werden

require_once 'vendor/autoload.php';

Abschließende Worte

Spielen Sie in Ihrem Projekt herum, erstellen Sie neue Verzeichnisse und Klassen und geben Sie ihnen einen geeigneten Namensraum und sehen Sie, ob das für Sie funktioniert. Wenn nicht, hinterlassen Sie uns unten einen Kommentar, wo Sie stecken geblieben sind. Wir werden Ihnen gerne helfen. Sie können uns auch folgen auf Twitter

Usama Muneer

Usama Muneer

A web enthusiastic, self-motivated & detail-oriented professional Full-Stack Web Developer from Karachi, Pakistan with experience in developing applications using JavaScript, WordPress & Laravel specifically. Loves to write on different web technologies with an equally useful skill to make some sense out of it.