Das Konzept von Namespaces
Die beiden grundsätzlichen Ziele
- Namespaces ermöglichen die logische Organisation von Klassen, sie schaffen thematische Gruppierungen von Klassen, die zusammenarbeiten.
- Namespaces ermöglichen es, den gleichen Namen für verschiedene Klassen einzusetzen.
Genauer erklärt: Verhinderung von Namenskollisionen
- Je umfangreicher deine PHP-Klassenbibliothek wird, desto grösser wird das Risiko, dass du oder jemand anders in deinem Entwicklerteam versehentlich einen zuvor deklarierten Klassennamen verwendet.
- Das Problem wird noch verschärft, wenn man versucht, Klassen von Drittanbietern hinzuzufügen: Die Wahrscheinlichkeit steigt, dass diese einen Klassen-Namen verwenden, der in den eigenen Codes bereits zum Einsatz kommt.
- Versucht man, zwei gleiche Klassennamen (ohne namespaces) zu verwenden, bricht PHP mit einem Fehler ab:
Fatal error: Cannot declare class ..., because the name is already in use in ...
- Setzt man keine Namespaces ein, braucht es deshalb lange und umständliche Klassennamen, um die Bezeichnung einzigartig zu machen.
Namespaces schreiben
- Namespaces sind ein abstraktes, virtuelles Konzept, bei der Definition von Namespaces spielt es (vorerst) keine Rolle, wo im Dateisystem die Codes zuhause sind.
- Es kann sogar mit zwei verschiedenen Namespaces im gleichen Dokument gearbeitet werden, wovon aber abgeraten wird.
- Etwas verwirrend ist die Tatsache, dass es in Namespaces - analog zum Dateisystem - auch eine "Verschachtelungs"-Hierarchie gibt. Bei Namespaces werden zur Kennzeichnung der Hierarchiestufen Backslashes verwendet.
Beispiel für die Notation:
namespace Europe\Switzerland\Berne
Links:
Muss ich Namespaces in meinem Code verwenden?
Nein. Ich kann auch im sog. globalen Namespace arbeiten
Für OOP-Einsteiger:innen sind Namespaces ein schwierig zu verstehendes Konzept. Wenn man sich noch unsicher damit fühlt, kann der eigene Code global (also ohne Namespaces) notiert werden. Trotzdem kann eine Bibliothek verwendet werden, die mit Namespaces arbeitet. Wichtig ist einfach, dass man begreift, wie man eine Klasse mit eigenem Namensraum im globalen Namespace intanziieren muss.