Drücke die Tasten ◄ ► für weitere Artikel  

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?

Namespaces in PHP 5.3+: Code einfach indexieren und strukturieren

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

 

80 Shares bis jetzt – Dankeschön!

Bewerten
VN:F [1.9.22_1171]
12 Antworten
  1. von pat am 25.10.2012 (11:18Uhr)

    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.

  2. von Prodeveloper am 25.10.2012 (13:09Uhr)

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

  3. von Christopher am 25.10.2012 (14:06Uhr)

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

  4. von achim am 25.10.2012 (14:35Uhr)

    @Christopher: Nicht den Troll füttern!

  5. von WennDannRichtig. am 25.10.2012 (14:35Uhr)

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

  6. von MadCat am 25.10.2012 (16:01Uhr)

    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.

  7. von Ilja Zaglov am 25.10.2012 (16:11Uhr)

    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.

  8. von FvG am 25.10.2012 (17:02Uhr)

    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)

  9. von WennDannRichtig. am 25.10.2012 (17:16Uhr)

    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.

  10. von Alex am 25.10.2012 (19:19Uhr)

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

  11. von Viktor am 27.10.2012 (14:31Uhr)

    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

  12. von Maximilian am 29.10.2012 (20:32Uhr)

    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.

Deine Meinung

Bitte melde dich an!

Du musst angemeldet sein, um einen Kommentar schreiben zu können.

Jetzt anmelden

Mehr zum Thema Webentwicklung
Mehr Performance und Sicherheit: Facebook veröffentlicht eigene Programmiersprache „Hack“
Mehr Performance und Sicherheit: Facebook veröffentlicht eigene Programmiersprache „Hack“

Mit PHP HipHop und HHVM hat der Social-Media-Riese einen Schritt in Richtung Performance-Steigerung und Code-Sicherheit gemacht. Jetzt hat Facebook Hack vorgestellt. » weiterlesen

Kollaboratives Programmieren: 5 Online-Tools im Überblick
Kollaboratives Programmieren: 5 Online-Tools im Überblick

Es gibt Situationen da wäre es schön, eine Datei mit mehreren Personen gleichzeitig bearbeiten zu können. Sei es, um schneller voranzukommen, oder andere einfach zuschauen zu lassen.... » weiterlesen

t3n 100:  Die 10 wichtigsten Köpfe in den Kategorien „Webdesign“ und „Webentwicklung“
t3n 100: Die 10 wichtigsten Köpfe in den Kategorien „Webdesign“ und „Webentwicklung“

In t3n 34 haben wir die 100 wichtigsten deutschsprachigen Köpfe im Web vorgestellt. Die jeweils zehn wichtigsten Personen aus den Kategorien „Webdesign und Frontend“ sowie „Webentwicklung“... » weiterlesen

Kennst Du schon unser t3n Magazin?

t3n-Newsletter
Top-Themen der Woche für Web-Pioniere
Jetzt kostenlos
anmelden
Diesen Hinweis verbergen