Anzeige
Anzeige
UX & Design
Artikel merken

Namespaces in PHP 5.3+: Code einfach indexieren und strukturieren

Mit Namespaces stellt PHP eine komfortable Möglichkeit bereit, um Code zu trennen. Doch was genau sind Namespaces und wie setzt man sie richtig ein?

Von Ilja Zaglov
4 Min. Lesezeit
Anzeige
Anzeige

phpcode_39972-595x125.jpg" alt="" width="595" height="125" />

Was sind Namespaces?

Anzeige
Anzeige

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.

Anzeige
Anzeige

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.

Anzeige
Anzeige

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.

Anzeige
Anzeige

<?

namespace mein_projekt {

function test(){

Anzeige
Anzeige

echo "Eine Funktion aus meinem Namespace!";

}

}

Anzeige
Anzeige

?>

Es können auch mehrere Namespaces in einer Datei enthalten sein.

<? 

Anzeige
Anzeige

namespace mein_projekt {

//Functions, Classes, Constants etc.

}

Anzeige
Anzeige

namespace mein_projekt2{

//Functions, Classes, Constants etc.

}

Anzeige
Anzeige

?>

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 bigIlja 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.

 

Mehr zu diesem Thema
PHP
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
13 Kommentare
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

pat

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.

Antworten
wiesson

Da muss ich gerade mal widersprechen. Ich bin kein PHP Entwickler, brauche aber trotzdem einen schnellen, verständlichen Überblick über Namespaces :)

Antworten
Prodeveloper

PHP ist der größte designmurcks da helfen auch keine Namespaces! Es ist und bleibt eine nicht ernstzunehmende skriptkiddie Sprache.

Antworten
Christopher

Stimmt prodeveloper und genau aus diesem Grund entstehen die größten Webprojekte überhaupt!

Antworten
achim

@Christopher: Nicht den Troll füttern!

Antworten
WennDannRichtig.

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).

Antworten
MadCat

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.

Antworten
Ilja Zaglov

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.

Antworten
FvG

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)

Antworten
WennDannRichtig.

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.

Antworten
Alex

Ich fand den Artikel kurz und knackig und genau so muss er sein. Danke.

Antworten
Viktor

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

Antworten
Maximilian

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.

Antworten
Abbrechen

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Anzeige
Anzeige