Das neue PHP-Release: Hat sich das Warten gelohnt?

PHP 5.3, Teil 3
Kommentare

Lesen Sie in der aktuellen Ausgabe eine kleine Einführung in die Namespaces.

Kaum ein PHP-Release hat so lange auf sich warten lassen wie die Version 5.3. Hat sich das lange Warten gelohnt und wann sollte man umsteigen? Wir sehen uns die wichtigsten Neuerungen in PHP 5.3 an und ich zeige Ihnen, was man damit machen kann.

Lesen Sie diese Woche jeden Tag einen Teil des Leitartikels PHP 5.3 – Das neue PHP-Release: Hat sich das warten gelohnt? unserer Ausgabe 5.09 auf phpmagazin.de.

Namespaces

Eines der vielleicht am meisten diskutierten Features in PHP sind die Namensräume, die ursprünglich bereits für PHP 5 geplant waren, dort jedoch wegen technischer Probleme bei der Implementierung in letzter Minute wieder aus dem Release entfernt worden waren. Namensräume helfen, in komplexen Anwendungen Namenskonflikte zwischen Klassen und Funktionen zu vermeiden. Bisher konnte man diese Namenskonflikte nur durch eindeutige Präfixe vor Klassen- und Funktionsnamen vermeiden, was nicht unbedingt zu schönen Namen führt. Ursprünglich waren als Trennzeichen zwischen den einzelnen Namensbestandteilen eines Namensraumes zwei Doppelpunkte vorgesehen. Das führt jedoch schnell zu Mehrdeutigkeiten, da unklar ist, ob etwa foo::bar::baz() ein Aufruf der Funktion baz() im Namensraum foo::bar oder ein statischer Methodenaufruf der Methode baz() der Klasse bar im Namensraum foo ist. Man legte daher als Trennzeichen für die Namensräume den Backslash fest, weil dieser das einzige Zeichen ist, das PHP-intern zu keinerlei Konflikten führt. Ein Namensraum wird durch das Schlüsselwort namespace definiert, das am Anfang einer Datei stehen muss:

namespace Foo 
{ 
  class Test 
  { 
  } 
} 

namespace FooBar 
{ 
  class Test 
  { 
  } 
} 

Eine Datei kann mehrere Namensräume enthalten, und ein Namensraum kann sich auf mehrere Dateien erstrecken, indem dort jeweils ein Namensraum gleichen Namens deklariert wird. Die geschweiften Klammen können übrigens auch weggelassen werden:

namespace FooBar 
class Test 
{ 
}

Namensräume in PHP sind nicht hierarchisch, auch wenn es den Anschein hat: Der Namensraum FooBar hat mit dem Namensraum Foo nur „zufällig“ die erste Komponente gemeinsam. Jede Klasse kann nun über ihren voll qualifizierten Namen, also etwa FooBarTest, angesprochen werden. Ein nicht qualifizierter Klassenname wird jeweils im aktuellen Namensraum gesucht.

Eingebaute Klassen wie Exception befinden sich im globalen Namensraum, der, ähnlich wie das Wurzelverzeichnis im Dateisystem, durch einen vorangestellten Backslash notiert wird. Das folgende Programm führt zu einem Fehler:

namespace Test; 
class Foo 
{ 
  public function __construct() 
  { 
    throw new Exception('Failed'); 
  } 
} 
$foo = new Foo(); 

Die nicht qualifizierte Klasse Exception wird hier im aktuellen Namensraum gesucht. Da aber dort eine Klasse TestException nicht existiert, wird das Programm mit einer Fehlermeldung abgebrochen. Abhilfe schafft man, indem man durch einen vorangestellten Backslash deutlich macht, dass man sich auf die Klasse Exception im globalen Namensraum bezieht:

public function __construct() 
{ 
  throw new Exception('Failed'); 
} 

Nun möchte man Klassen in anderen Namensäumen nicht immer mit ihrem voll qualifizierten Namen ansprechen. PHP 5.3 bietet daher die Möglichkeit, Alias-Namen zu definieren:

 namespace Main 
 { 
   use FooTest as Test; 
   var_dump(new Test()); 
 } 

Wie man sieht, kann man nun innerhalb des Namensraums Main die Klasse FooTest unter dem Namen Test ansprechen. Namensräume erstrecken sich allerdings nicht nur auf Klassen, sondern auch auf Funktionen und Konstanten. Allerdings gibt es hier zwei wichtige Unterschiede. Erstens ist es nicht möglich, für Funktionen mittels use-Statement Aliase zu definieren. Man muss mit den vorhandenen Namen leben und hat keine Möglichkeit, Namenskonflikte über Aliase aufzulösen. Zweitens werden Klassen standardmäßig immer im aktuellen Namensraum gesucht und ein fataler Fehler ausgelöst, wenn diese dort nicht gefunden werden. Bei Funktionen dagegen, die im aktuellen Namensraum nicht vorhanden sind, werden die gleichnamigen Funktionen im globalen Namensraum aufgerufen. Wollen Sie sicherstellen, dass eine eingebaute PHP-Funktion, also eine Funktion im globalen Namensraum aufgerufen wird, stellen Sie dem Namen einen Backslash voran:

var_dump(strlen('test'));

Interessanter Artikel?

width=“75″ height=“106″ alt=“PHP Magazin 5.09″ />

Gefällt Ihnen dieser Artikel? Dies und mehr ist alles Teil der Ausgabe 5.09 unseres PHP Magazins. Alle zwei Monate frisch am Kiosk! Zur jeweils aktuellen Ausgabe geht es hier.

Ansonsten riskieren Sie, dass durch Einführung einer Funktion strlen() im aktuellen Namensraum das Verhalten des Programms geändert wird – dieses Verhalten kann man sich aber natürlich auch bewusst zu Nutze machen, um eingebaute PHP-Funktionen „anzureichern“.

Für Konstanten gilt analog das Gleiche wie für Funktionen. Existiert eine Konstante im aktuellen Namensraum nicht, wird auf die Konstante gleichen Namens im globalen Namensraum zurückgegriffen. Da man ohnehin besser Klassenkonstanten verwenden sollte, dürfte dieser „Fallback“-Mechanismus aber nicht zu großen Problemen führen. Sofern Sie eine Autoload-Funktion verwenden, müssen Sie diese vermutlich anpassen, da ihr jeweils ein voll qualifizierter Klassenname übergeben wird. Es bietet sich natürlich an, die quasi-hierarchische Struktur der Namensräume unverändert in das Dateisystem abzubilden. Verwendet man das PEAR-Namenssschema, sind nur wenige Änderungen notwendig, da nur die Unterstriche in den Klassennamen durch Backslashes ersetzt werden müssen. Die neue magische Konstante __NAMESPACE__ gibt jeweils Auskunft darüber, in welchem Namensraum man sich gerade befindet.

Lesen Sie morgen den vierten Teil unserer Serie zu PHP 5.3: Phar.

Stefan Priebsch Dipl. Inform. Stefan Priebsch ist Mitgründer und Principal Consultant bei thePHP.cc und Autor mehrerer Fachbücher, darunter auch target=“_blank“>PHP 5.3 – Die Neuerungen, das im entwickler.press-Verlag erscheint.

 
Das ist neu in PHP 5.3
  1. Neue und verbesserte Funktionen
  2. Verbesserte Windows-Unterstützung & Late Static Binding
  3. Namespaces
  4. Phar
  5. … und Vieles mehr
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -