OOP in PHP – Teil 13: Namespaces

Mit PHP 5.3 hielten die Namespaces Einzug. In anderen Programmiersprachen wie zum Beispiel C# schon lange im Einsatz helfen diese kleinen Strukturen nun auch uns bei der Übersichtlichkeit unseres Codes. Schauen wir uns einmal an, was Namespaces überhaupt sind und wie man sie in PHP einsetzen kann.

Was sind Namespaces?

Namespaces sind abgetrennte Bereiche, in denen gewisse logische Dinge (in unserem Fall Klassen, Interfaces, Funktionen und Konstanten) leben können. Diese Bereiche sorgen für eine Aufteilung und Kapselung des Codes und verhindern Namenskonflikte. Folgendes Beispiel:

Du programmierst eine Website mit mehreren Seiten. Ganz im objektorientierten Sinne programmierst du nun also eine Klasse Page, welche sich um die Verwaltung und Darstellung der Seiten kümmert. Da du auf deiner Website PDF Dateien generieren möchtest bindest du ein Modul an, das diese Aufgabe für dich übernimmt.

Da natürlich auch die PDF Dateien Seiten enthält hat auch dieses Modul eine Page Klasse. Versuchst du nun, beide Klassen in einem Projekt unterzukriegen wird PHP sich logischerweise beschweren, schließlich kann es nie genau sagen, auf welche Page Klasse du nun zugreifen möchtest. Und hier kommen Namespaces ins Spiel!

Stell dir das Dateisystem auf deinem Computer vor. Auch hier ist es nicht möglich, zwei Dateien mit demselben Namen im selben Verzeichnis zu haben. In PHP wären die Dateien in diesem Fall unsere Klassen, die Verzeichnisse unsere Namespaces.

PHP bietet uns seit der Version 5.3 also nun die Möglichkeit, unsere Klassen in Unterverzeichnisse zu organisieren. Für das Beispiel von oben könnte das zum Beispiel so aussehen, dass alle Klassen im PDF Modul im Unterverzeichnis PDF liegen und die Page Klasse dementsprechend mit \PDF\Page() angesprochen wird. Aber wie das genau funktioniert schauen wir uns weiter unten noch Stück für Stück an.

 

Wie deklariere ich einen Namespace?

Genug von der Theorie, wenden wir uns der Praxis zu. Wie können wir nun selbst einen dieser Namespaces einsetzen? Zuerst müssen wir diesen mal deklarieren:

Wie wir in diesem Beispiel sehen ist die Deklaration sehr einfach und mit nur einer Zeile erledigt. Trotzdem gibt es hier schon einige Dinge zu beachten.

  1. Die Namespace Deklaration muss am Anfang der Skriptdatei stehen. Davor dürfen nur die PHP Klammern (<?php) und der Ausdruck declare stehen, welcher die Kodierung der Datei beschreibt. Weder anderer PHP Code noch HTML Code darf in der Datei vor dem Schlüsselwort namespace vorkommen.
  2. Ein Namespace muss nicht nur aus einem Wort bestehen, er kann mehrere Teile haben – genau wie die Verzeichnisse im Betriebssystem. Die einzelnen Teile werden mit einem Backslash ( \ ) unterteilt.
  3. Im Gegensatz zu anderen Konstrukten darf derselbe Namespace Name in mehreren Dateien vorkommen. Die einzelnen Komponenten dieser Dateien (Klassen etc) leben dann gemeinsam in diesem Namespace.

Wie benutze ich nun Klassen innerhalb eines Namespace?

Haben wir unsere Klasse in einem Namespace deklariert stellen wir nun fest dass ein einfaches new Beispiel(); nur noch eine Fehlermeldung von PHP liefert. Als nächsten Schritt müssen wir dem PHP Interpreter nun genau mitteilen, welche Klasse in welchem Namespace wir meinen.

Für obiges Beispiel sieht das folgendermaßen aus:

Genau wie mit einer Datei im Verzeichnissystem eben. Achten müssen wir auch auf die Besonderheit, wenn wir uns in einer Datei mit einem deklarierten Namespace befinden.

Dieser Namespace wird als aktiver Namespace angenommen. Möchten wir also eine andere Klasse aufrufen müssen wir auch hier wieder den kompletten Pfad angeben (auch für Klassen im root-Namespace \ wie zum Beispiel DateTime!).

Im Beispiel sieht man deutlich die Unterschiede. Eine Klasse innerhalb eines Namespace muss immer mit dem vollen Pfad angesprochen werden. Klingt umständlich oder? Keine Angst, das haben sich die Programmierer von PHP auch gedacht und uns dafür das Schlüsselwort use gegeben.

 

Was ist das use Schlüsselwort?

Mit Hilfe des kleinen Schlüsselwort use können wir eine Art Spitznamen für eine Klasse vergeben. Ein ganz einfaches Beispiel:

 

Wir vergeben hier also den Spitznamen UnserBeispiel für die Klasse die wir oben definiert haben. Ab diesem Moment können wir immer den kurzen Namen UnserBeispiel verwenden.

Bei use gibt es allerdings auch einige Abkürzungen und Besonderheiten:

 

Wir sehen also, hat man sich mal ein wenig mit den Namespaces beschäftigt sind sie gar nicht mehr so kompliziert und bringen eine Menge Nutzen mit sich. Allerdings sollten wir von vornherein Namespaces einplanen da es sonst schnell zu größerem Aufwand kommt, wenn wir sie später implementieren wollen.

2 Kommentare zu “OOP in PHP – Teil 13: Namespaces

  1. Das ist mit das beste was ich je als Einführung gelesen habe. Ansatz/Möglichkeiten und Beispiel, so brauchen es Autodididakten die sich seit Jahrzenten durch diverse Programmiersprachen kämpfen müssen.

    Großen Dank und ein großes Lob von mir, auch für die Umsetzung OOP auf der Website, Hut ab !

    Gruß Meikel { Programmierrentner }

  2. Hallo!
    Ich musste es mal genauer wissen, da ich nur am Rande mit Namespaces zu tun hatte.

    Die Erklärungen auf dieser Seite sind das Beste, was ich im Netz gefunden habe!

    Vielen Dank!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*