PHP - Namespaces

Aus Wikizone
Wechseln zu: Navigation, Suche
http://www.php.net/manual/de/language.namespaces.php
https://www.webmasters-akademie.de/blog/programmierung_code_software_entwicklung/namespaces-in-php-wozu-das-ganze

Namespaces bieten die Möglichkeit, Funktionen und Klassen in Bereiche zu unterteilen. Ihr könnt euch das in etwa wie Order im Dateisystem vorstellen. Klassen und Funktionen sind Dateien, Namespaces sind Ordner. So lange Ihr nur sehr wenige Dateien habt, ist es kein Problem, alle in einem Ordner abzulegen. Sobald jedoch die Anzahl der Dateien zunimmt, kommt es zu zwei Problemen:

  • Die Liste von Dateien wird sehr lang und damit unübersichtlich.
  • Es wird zunehmend schwerer, gute Dateinamen zu finden, die noch nicht belegt und nicht sehr lang sind.

Genauso wie Ihr eure private Bildersammlung, die Urlaubsfotos, Portraits, Familienfotos, Bilder der Haustiere ... enthält, nicht komplett in einem Ordner ablegt, solltet Ihr in größeren Projekten nicht auf Namespaces verzichten. Bei einigen wenigen Schnappschüssen/bei einem kleinen PHP-Projekt (an alle Teilnehmer: ja, das Reisebüro-Beispielprojekt ist klein!) ist das egal.

Besonders der zweite Punkt der Aufzählung hat in PHP historisch zu den seltsamsten Erscheinungen geführt: Klassennamen ala Zend_Service_WindowsAzure_Storage_Blob_Stream, Services_W3C_HTMLValidator_Message oder Services_Amazon_S3_AccessDeniedException sind in großen PHP-Projekten keine Seltenheit. Da Klassennamen wie Stream oder Message so allgemein sind, dass sie quasi in jedem Projekt vorkommen können, haben die Programmierer sehr lange und oft seltsam klingende Präfixe vorangestellt, um den Klassennamen eindeutig zu machen.

Genau das selbe Problem gibt es bei den vielen PHP-Funktionen. Wie oft habe Ihr euch einen Namen für eine Funktion ausgedacht, der perfekt auf die Funktionalität passt, nur um festzustellen, dass er von PHP schon verwendet wird? Dank Namespaces könnt Ihr ab PHP 5.3 alle Funktionen und Klassen in Unterorder packen. Gucken wir uns das doch einmal näher an:

Namespace definieren[Bearbeiten]

Einen Namespace definiert Ihr in PHP, indem Ihr an den Anfang einer PHP-Datei das Schlüsselwort namespace mit dem gewünschten Namen schreibt.

Beispiel:

namespace Reisebuero;

Alle Klassen und Funktionen, die in dieser Datei folgen, liegen jetzt im Namespace Reisebuero. Doch was bedeutet das nun genau? Sehen wir uns erst einmal ein ausführlicheres Beispiel an:

<?php
namespace Reisebuero;
 
class Reise
{
}
 
class Land
{
}
 
function tue_was()
{  
}

Wenn Ihr diese Datei jetzt per require in einer anderen Datei einbindet, könnt Ihr die Klassen/Funktionen nicht direkt ansprechen, sondern Ihr müsst den Namespace, also den "Ordnernamen" vor den Namen schreiben:


require_once 'reisebuero.php';
 
$reise1 = new Reisebuero\Reise();
echo Reisebuero\tue_was();

Ja, der Trenner zwischen Namespace und Name ist der Backslash! Ich hab mich auch darüber gefreut, dass die PHP-Entwickler ausgerechnet dieses Zeichen genommen haben, aber was solls!

Das Schlüsselwort use[Bearbeiten]

Jetzt fragt Ihr euch eventuell, welchen Vorteil die Klassennamen mit Backslash gegenüber der vorherigen Schreibweise mit dem Unterstrich (Reisebuero_Reise) bieten? Es ist möglich, Klassen aus anderen Namespaces zu importieren und damit den Namespace wegzulassen. Zu diesen Zweck verwendet man das Schlüsselwort use.

Beispiel:

require_once 'reisebuero.php';
 
use Reisebuero\Reise;
 
$reise1 = new Reise();
$reise2 = new Reise();
$reise3 = new Reise();
$reise4 = new Reise();

Mit use sagen wir PHP, dass es in die aktuelle Datei die Klasse Reisebuero\Reise unter dem Namen Reise importieren soll. Gerade, wenn Ihr einen Klassennamen häufiger verwendet, ist es wirklich einfacher, den langen Namen nur einmal schreiben zu müssen.