Namespaces in PHP 5.3+: Code einfach indexieren und strukturieren
phpcode_39972-595x125.jpg" alt="" width="595" height="125" />
Was sind Namespaces?
Stell dir Namespaces als Schrank vor, in den du alle möglichen Dinge tun kannst. Alles in diesem Schrank ist dein Eigentum. Direkt neben dir ist der Schrank deines Kollegen, in dem genau die gleichen Sachen drin liegen. Damit ihr eure Sachen nicht verwechselt, beschriftet ihr diese Schränke, sodass ihr wisst, welche Gegenstände wem gehören.
Genau so funktionieren Namespaces. Früher musste man Funktionen und Klassen umschreiben, damit man nicht in Konflikte mit anderen Funktionen und Klassen tritt. Das wäre in etwa damit zu vergleichen, dass man jeden Gegenstand einzeln beschriftet – also nicht sonderlich effizient.
Die Lösung sind die seit PHP 5.3 verfügbaren Namespaces. Mit ihnen können die gleichen Funktionen, Klassen, Interfaces und so weiter deklariert werden wie in anderen Namespaces, ohne Probleme mit dem PHP-Compiler zu bekommen.
Bereits jetzt nutzen wir einen wichtigen Namespace: Denn alle Funktionen, Klassen etc., die wir schreiben und als Standardausführung in PHP vorhanden sind, gehören zum so genannten global space. Wichtig: Man muss Namespaces nicht benutzen. Scripte funktionieren ohne Namespaces und werden das auch in nächster Zukunft noch tun.
Namespace deklarieren
Die Deklaration eines Namespaces muss direkt am Anfang einer PHP-Datei erfolgen. Das passiert mit der simplen Syntax namespace keyword. Ein Namespac- Name unterliegt den gleichen Regeln wie Variablen: Sie müssen mit einem Buchstaben oder Unterstrich beginnen und werden gefolgt von einer beliebigen Anzahl von Buchstaben, Ziffern und Unterstrichen.
<?
namespace mein_projekt {
function test(){
echo "Eine Funktion aus meinem Namespace!";
}
}
?>
Es können auch mehrere Namespaces in einer Datei enthalten sein.
<?
namespace mein_projekt {
//Functions, Classes, Constants etc.
}
namespace mein_projekt2{
//Functions, Classes, Constants etc.
}
?>
Die geschweiften Klammern sind optional. Am besten führt man nur ein Namespace pro Datei. So kommt man nicht durcheinander und kann sich das Einrücken der zum Namespace gehörenden Funktionen ersparen.
Sub-Namespaces
Manchmal kann es Sinn ergeben, Sub-Namespaces anzulegen. Es können beliebig viele Sub-Namespaces angelegt werden. Notiert werden sie wie ein Ordnerpfad.
<?
namespace mein_projekt;
function test(){
echo "Test Funktion aus dem Namespace 'mein_projekt'.";
}
namespace mein_projekt\mein_unterprojekt;
function test(){
echo "Test Funktion aus dem Namespace 'mein_projekt\mein_unterprojekt'";
}
?>
Um die Flexibilität und Übersicht über die Namespaces zu bewahren, empfiehlt es sich für die Sub-Namespaces auch entsprechende Unterordner anzulegen.
Auf Namespaces zugreifen
Nachdem wir die Namespaces gefüllt haben, wollen wir natürlich darauf zugreifen. Hierfür schreiben wir einfach den „Pfad“ des jeweiligen Namespaces vor die jeweils aufzurufende Funktion, Klasse und so weiter. So ruft der folgende Code die Funktion test() aus dem Namespace mein_projekt auf, der vorher über require() hinzugeladen wurde
<?
require 'namespace.php';
mein_projekt\test();
?>
Es gibt verschiedene Möglichkeiten auf die Inhalte eines Namespace zuzugreifen. Ähnlich wie bei Links gibt es die Möglichkeit, relative und absolute Angaben zum Pfad zu machen. Will man aus dem Global Namesepace auf eine Funktion in einem anderen Namespace zugreifen, gibt man wie oben gesehen seinen Pfad ein.
Will man hingegen aus diesem Namespace heraus auf einen Unternamespace zugreifen, gibt man einfach den relativen Pfad zu diesem Unternamespace ein. Das heißt im namespace mein_projekt reicht uns die folgende Zeile schon aus, um auf den Subnamespace mein_unterprojekt zuzugreifen:
<?
namespace mein_projekt;
function test(){
mein_unterprojekt\test();
}
?>
Um auf einen Namespace zugreifen zu können, der in der Hierarchie übergeordnet ist, muss man den kompletten Pfad zu dem Namespace angeben. Das heißt, wenn ich aus mein_projekt/mein_unterprojekt die Funktion test() von mein_projekt aufrufen möchte, muss ich den gesamten Pfad vom global namespace gesehen in den Aufruf einfügen. In dem Fall:
<?
namespace mein_projekt\mein_unterprojekt;
function test(){
\mein_projekt\test();
}
?>
Das namespace Keyword
Mit dem Keyword namespace kann man nicht nur Namespaces definieren. Innerhalb eines Namespaces verhält sich der Aufruf wie das keyword self in Klassen und ermöglicht die direkte Addressierung von Objekten innerhalb des Namespace.
<?
namespace mein_projekt;
function test(){
namespace\test2();
}
function test2(){
echo "Test 2";
}
// Ausgabe: Test 2
?>
Die __NAMESPACE__ Konstante
Mit der Konstante __NAMESPACE__ kann man jederzeit den Namen des jeweiligen Namespace ausgeben lassen.
<?
namespace mein_projekt\mein_unterprojekt\mein_unterprojekt2;
function test(){
echo __NAMESPACE__;
}
// Ergebnis: mein_projekt\mein_unterprojekt\mein_unterprojekt2
?>
Importieren
Namespacing in PHP unterstützt den Import von fremden Namespaces. Das ermöglicht die Benutzung von externem Code ohne sich Gedanken über Namenskonflikte machen zu müssen. Erzielt wird der Import mit dem use keyword.
use [namespace] as [optional_custom_alias]
<?
namespace mein_projekt\mein_unterprojekt\mein_unterprojekt2;
use mein_projekt as mein_projekt;
function test(){
mein_projekt\test();
}
?>
Mit diesem Aufruf wird es möglich, innerhalb des namespace mein_projekt\mein_unterprojekt\mein_unterprojekt2 auf den Namespace mein_projekt zuzugreifen, ohne den kompletten Pfad immer wieder ausschreiben zu müssen.
Namespaces – kein „Muss“ aber sehr nützliches „Kann“
Die Nutzung von Namespaces ist wie gesagt optional, kann aber gerade bei großen Projekten und bei Arbeiten im Team sehr hilfreich sein. Selbst wenn man Namespaces vielleicht als nicht wirklich notwendig ansieht, sollte man zumindest den Umgang mit diesen beherrschen. Mehr Informationen zu diesem Thema gibt es im PHP Manual zu Namespaces.
Über den Autor
Ilja Zaglov ist selbstständiger Kommunikations- & Mediendesigner. Er unterstützt kleine und mittelständische Unternehmen bei der Erstellung von Online- und Offline-Medien. Neben Web-Gestaltung gehören Motion-Graphics und 3D-Inhalte zu seinen Spezialgebieten.
findet ihr nicht, dass der Artikel ein wenig arg zu spät kommt?
Wäre ein Artikel über traits nicht besser gewesen. Das wäre nicht so sehr an der Zeit vorbei.
Jeder der sich ernsthaft mit PHP auseinandersetzt kennt Namespaces schon aus viele Frameworks.
Da muss ich gerade mal widersprechen. Ich bin kein PHP Entwickler, brauche aber trotzdem einen schnellen, verständlichen Überblick über Namespaces :)
PHP ist der größte designmurcks da helfen auch keine Namespaces! Es ist und bleibt eine nicht ernstzunehmende skriptkiddie Sprache.
Stimmt prodeveloper und genau aus diesem Grund entstehen die größten Webprojekte überhaupt!
@Christopher: Nicht den Troll füttern!
Junge mach Kommunikations- & Mediendesign und nicht sowas…
Wenn PHP5.3 und Namespace dann auch Beispiele mit minimum 1-2 Klassen.
In 4 Wochen kommt nen Artikel über public / protected / private.
In 8 Wochen über Konstanten und static.
In 3 Monaten womöglich über Interface und Abstract.
In 6 Monaten über Exception und in 2 Jahren über Pattern.
Ach ja und wegen Timing ist hier bestimmt bald django oder Ruby total der neue Renner.
T3N ist zu 90% doch nur noch Marketing und Apple (ach ist ja Marketing).
Mal ganz abgesehen von der Aktualität: warum sind die Namespace-Benennungen in den Beispielen nicht PSR-0-kompatibel? Zu dem Thema hätte außerdem auch Autoloading erwähnt werden müssen. Das macht doch kein ernsthafter PHP-Entwickler mehr mit include bzw. require von Hand.
Der Artikel ist als Einstieg für Leute mit weitaus weniger Hintergrundwissen gedacht. Diese greifen auch eher auf include/require zurück statt Autoloading zu benutzen. Um die Funktionsweise von Namespaces zu erklären, reicht es meiner Meinung nach in der Form aus.
Dass es Namespaces schon seit 5.3 gibt und erfahrene Entwickler längst damit vertraut sind, sollte auch relativ klar sein. An erfahrene Entwickler richtet sich ein solcher Artikel nunmal auch nicht. Anfänger und einige fortgeschrittene User kennen aus meiner Erfahrung nicht die Möglichkeiten die Namespaces bieten – obwohl sie schon länger existieren. Ich finde also, dass das der Artikel auch heute durchaus eine Existenzberechtigung hat.
Namespaces sind doch schon alt .. Ihr hättet in dem Zusammenhang wenigstens noch PSR-0 und PSR-1 einbauen können. Und damit gleich noch Composer ;)
Für Einsteiger ist der Beitrag sicher gut geeignet. Aber dann gerne die volle Portion!
(Kleiner Überblick auf phptherightway.com)
Einsteiger sollten erstmal begreifen das sie Einsteiger sind.
Dann mit Dingen wie Klassen, Vererbung und autoload anfangen.
Datenbank (PDO)…..
Später dann Namespaces, PHPUnit, sich nen Framework aussuchen und auch mal über den Tellerrand hinaus schauen.
Ich fand den Artikel kurz und knackig und genau so muss er sein. Danke.
Tolle und echt ausführliche Artikel, Danke Ilja Zaglov.
Ich finde für Otto Normalverbraucher ohne Hintergrundwissen wie mich, alles klar erklärt.
Da ich erst seit kurzen PHP 5.3 habe.
MfG
Ich fand den Artikel auch super. Denn ich bin ein Einsteiger und versuche über den Tellerand hinaus zu schauen. Irgendwie habe ich dabei auch genau nach diesem Artikel gesucht. Vielen Dank.