PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


PHP 5.3 Feature: Namespaces

with 4 comments

Dies ist ein Text, der von einem Autor auf content.de erstellt wurde. Mehr dazu im Artikel über den content.de Test.

Mit Hilfe der Skriptsprache PHP werden hauptsächlich Webanwendungen oder Webseiten erstellt. Unter der PHP-Lizenz wird PHP als freie Software verbreitet. Durch die breite Datenbankunterstützung, Internet-Protokolleinbindung und durch die Verfügbarkeit zahlreicher Funktionsbibliotheken zeichnet sich PHP aus. Bei 75 Prozent aller Webseiten wird PHP als Programmiersprache eingesetzt. Es gibt keine andere Programmiersprache, die häufiger verwendet wird als PHP.

Viele wichtige PHP-Versionen wurden bis zum heutigen Tage entwickelt und in Zukunft wird die Entwicklung weiter laufen. Zu den wichtigen Versionen gehört auch PHP 5.3. Diese Version wird ausgezeichnet durch die Unterstützung von Namespaces. Der englische Begriff Namespace ist ein Programmierungsbegriff. Namespace bedeutet übersetzt Namensraum. Bei der objektorientierten Programmierung werden die Objektnamen als Baumstruktur angeordnet. Eindeutig angesprochen werden diese durch gewisse Pfadnamen innerhalb von der Namespace.

Nun sollt Ihr mehr über Namespace erfahren. Namespaces sind deklatorische Bereiche. Jeder weitere Name der in der Deklarierung auftaucht, bekommt einen zusätzlichen Bezeichner angeheftet. Diese zusätzlichen Bezeichner verhindern Verwechslungen mit anderen Namen, die in dem Programm deklariert sind. Es ist möglich gleiche Namen in verschiedenen Namensräumen ohne Probleme zu benutzen. Das funktioniert auch, wenn in der gleichen Übersetzungseinheit der gleiche Name auftaucht. Jeder Name ist eindeutig durch die angeheftete Bezeichnung des Namensraums. Um Euch zu erklären was das in Bezug auf PHP bedeutet, solltet Ihr zunächst von der Syntax ausgehen:

<?php
namespace PHPHatesMe;

function sometimesSure()
{
    return 'Yeah!';
}

Durch eine Deklaration wird ein neuer Namensraum eingeleitet. Wichtig ist, dass bei der Verwendung von Namespaces vor jeder Zeile der PHP-Code steht. Ihr solltet nicht vergessen, dass bei dieser Notation nur eine Namespace pro Datei ausführbar ist. Bei dem Aufruf dient der Backslash als Separator für Namensräume. Leider ist der Backslash nur auf englischen Tastaturen als Separator vorteilhaft für den Benutzer. Auf anderen Tastaturen wünschen sich viele Benutzer eine andere Eingabetaste für die Ausführung von dem Separator, da die Bedienung des Backslash ein wenig umständlich und gewöhnungsbedürftig ist. Wenn Ihr aus einem Namespace oder aus einer Datei heraus aufrufen möchtet, ist es nötig den Präfix an den Anfang zu setzten.

<?php
echo \PHPHatesMe\sometimesSure(); //Yeah!

Mit dem Keyword „use“ kann eine Namespace, durch eine globale Funktion, in eine andere eingefügt werden. In diesem Beispiel wird ein Namensraum in eine globale Funktion importiert. Diese globale Funktion des Namensraums ist ein bedeutsames Objekt, wenn Klassen oder Konstanten, die PHP-intern sind, von einem Namespace-Focus durch die globale Funktion angesprochen werden.

<?php
namespace PHPHatesMe\Really;

use \Exception as BaseException;

class Exception extends BaseException;
{

}
function throwMe()
{
    throw new Exception('Who am I?');  //PHPHatesMe\Really\Exception
}

Bringt man „use“ in Verbindung mit dem Keyword „as“, ist der Benutzer imstande für Namen einen Alias zu gebrauchen. Somit ist es möglich diesen komplett in den Namensraum zu integrieren. Bei Namenskonflikten oder Klassennamen kann diese Funktion für Euch sehr hilfreich sein. Dabei muss die Reduzierung der Les- und Wartbarkeit des Codes berücksichtigt werden. Ihr müsst schon genau wissen wie Ihr den Namen für Alias wählt. Wird der Name User in „U“ umbenannt, stellt Ihr euch bestimmt nach einiger Zeit die Frage, was dieses „U“ noch mal für eine Bedeutung hat. Natürlich könnt Ihr das in der Namespace-Deklaration nachsehen, aber dieser Schritt ist bei eindeutiger Deklaration absolut unnötig und ist unter Umständen auf Dauer sehr zeitraubend. Sollten bei der Zuweisung für Alias Konflikte auftreten, werden diese von PHP gemeldet. Nun seid Ihr durch diese kleine Einleitung von PHP 5.3 sicherlich etwas schlauer geworden. Ich hoffe, dass häufige Fragen über PHP 5.3 hiermit erklärt wurden, oder Euch zumindest ansatzweise einen Schritt weiter gebracht haben.

Written by Michael Kliewe

Mai 12th, 2011 at 9:54 am

Posted in PHP

Tagged with , , ,

4 Responses to 'PHP 5.3 Feature: Namespaces'

Subscribe to comments with RSS or TrackBack to 'PHP 5.3 Feature: Namespaces'.

  1. […] beiden Artikel befinden sich natürlich hier im Blog: Namespaces und […]

  2. Klar, bei nur so wenig Zeilen Code, kann man nichts besonderes machen und ähnlichen Code wird es immer geben, aber der Namenspace kam mir dann doch komisch und bekannt vor: http://www.phphatesme.com/blog/allgemein/php-53-die-neuen-features/ ! 😉

    IchBinIch

    12 Mai 11 at 10:33

  3. Schaut man sich den Artikel auf PHM an, ist das hier dann doch sehr gutternbergisch. Ein Abschnitt aus dem Original:

    > Dieses Keyword in Verbindung mit “use” ermöglicht es
    > dem Entwickler einen Alias für einen Namen zu
    > verwenden und diesen komplett in den Namespace zu
    > integrieren. Dies kann bei Namenskonflikten hilfreich
    > sein, oder bei zu langen Klassennamen Abhilfe
    > schaffen.

    Fälschung

    > Bringt man “use” in Verbindung mit dem Keyword “as”,
    > ist der Benutzer imstande für Namen einen Alias zu
    > gebrauchen. Somit ist es möglich diesen komplett in
    > den Namensraum zu integrieren. Bei Namenskonflikten
    > oder Klassennamen kann diese Funktion für Euch sehr
    > hilfreich sein.

    KingCrunch

    12 Mai 11 at 10:47

  4. Habe folgendes Problem:

    Funktioniert:
    namespace My\Test;
    $a = new ClassX;

    Funktioniert:
    namespace My\Test;
    $classname = ‚\My\Test\ClassX‘;
    $a = new $classname;

    Funktioniert NICHT wieso???:
    namespace My\Test;
    $classname = ‚ClassX‘;
    $a = new $classname;

    Master B.

    26 Jul 11 at 16:08

Leave a Reply

You can add images to your comment by clicking here.