Webmasters Akademie
vielen dank! du hast mir das leben gerettet :)
Danke für das Tutorial. Und der Kommentarbereich mit den "Zettel" sieht auch wirklich gelungen aus.…
Hallo Stephan,…
Tolle Einführung in die Thematik BDD! Bei den Empfehlungen würde ich aber definitiv noch Cucumber…
von Marc Remolt
in Programmierung
am Montag, 21. Juni 2010 um 17:50
Tags: PHP
, PHP 5.3
, Namespaces
Vielleicht seid Ihr beim Lesen von aktuellem PHP-Code schon darüber gestolpert, vielleicht habt Ihr auch schon etwas darüber gelesen: PHP bietet seit Version 5.3 Namespaces. Die Frage ist, wozu ist das gut?
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:
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:
Einen Namespace definiert Ihr in PHP, indem Ihr an den Anfang einer PHP-Datei das Schlüsselwort namespace mit dem gewünschten Namen schreibt.
<?php
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:
<?php
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!
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.
<?php
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.
So, das war es auch schon für heute. Ich hoffe, Ihr habe prinzipiell verstanden, wofür Namespaces gut sind. Im nächsten Artikel werde ich tiefer in das Thema eintauchen und Euch zeigen, wie man in größeren Projekten mit Namespaces arbeitet - da gibt es nämlich durchaus einige Stolperfallen.
Bis zum nächsten Artikel möchte ich euch schon mal auf die offizielle PHP-Dokumentation zu dem Thema verweisen: http://www.php.net/manual/de/language.namespaces.php
Gruß
Marc
Kommentare (4)
von Robert Heine
am Montag, 21. Juni 2010, 20:57
Hi Marc
Ich bin grade zufällig auf den Blog gestoßen und hab mir diesen Artikel gleich durchgelesen. Um was es bei Namespaces geht hast du sehr gut beschrieben. Wie immer :-)
Ich hatte erst das letzte Jahr an einem aufwändigen Intranet in PHP programmiert und auch sehr viele Klassen dabei benutzt. Aber wenn ich darüber nachdenke, ob Namespaces irgendwas dabei vereinfacht hätten, muss ich sagen: Nö. Für mich selbst kann ich darin immer noch keinen Nutzen erkennen. Vielleicht war sogar dieses Projekt noch nicht groß genug...
Was ich bei dem Blog hier auf jeden Fall grade vermisst habe sind die Social Media Buttons (Tweet this, auf Facebook veröffentlichen, usw). Sonst hätte ich diesen Beitrag direkt mal weiterverbreitet.
Greetings,
Robert
(2006-2007)
von Marc
am Dienstag, 22. Juni 2010, 09:55
Hi Robert,
ich würde mal ganz frech sagen - wenn du es alleine programmiert hast, war es nicht so groß. ;-) Zum Vergleich: unsere Webseite, die du vor dir siehst, besteht aktuell aus 618 Klassen und ca. 40000 Zeilen Code.
Außerdem ist nicht nur die Größe ausschlaggebend, darauf gehe ich in einem nächsten Artikel näher ein. Gerade wenn du fertige PHP-Bibliotheken in deinem Projekt verwendest, wird es immer wahrscheinlicher, dass ein Klassenname bereits vergeben ist.
Das Problem hatten wir erst mit unserer Webseite. Zwei Bibliotheken (eine für Blog-Tagging, eine für das Parsen von HTML-Tags), die wir verwenden wollten, haben beide eine globale Klasse namens "Tag" definiert, also ohne Namespaces. Wir mussten uns tatsächlich für eine der beiden entscheiden, da beide zusammen wegen dem Namen nicht starten wollten. Ich hätte die Programmierer der Bibliotheken am liebsten ...
Die Social-Media-Buttons sind schon in Arbeit. Da wir den Blog selbst schreiben, kommen die Features erst nach und nach. Wir wollten einfach nicht warten, bis "alles" fertig ist, bevor der Blog öffentlich wird, sondern online gehen, sobald er nutzbar ist.
Gruß
Marc
P.S. Mein privater Blog hat schon solche Buttons - viel Spaß beim anklicken. ;-)
von Marco Emrich
am Dienstag, 22. Juni 2010, 10:11
Ehrlich gesagt ist unser waportal (Webmasters Website + LMS + Backend) von dem Marc redet eher ein mittleres Projekt. Unter einen große Projekt verstehe ich Systeme jenseits der 1 Million Lines of Code. Solche Systeme werden meist auch von größeren Programmierteams (> 20 Entwickler) be-ackert.
Unabhängig davon, teile ich Marcs Meinung: Namespace sind eigentlich für alle Größen von Projekten sinnvoll. Sie helfen dabei Namenskollisionen zu vermeiden.
Gruß,
Marco
von Dorian
am Samstag, 26. Juni 2010, 18:06
Hi,
Super - wollte schon anfangen im Lernforum php 5.3 fragen zu stellen...
und schwups... da ist schon der erste blog ;)
Hoffe es kommen auch Lambda und Closures dran und ewt. auch noch ein paar nützliche tips zu 5.3 ... ;).
Noch zu Namespaces:
ich habe mich noch nicht auf wirklich auf PHP 5.3 eingestellt, weil ich seit einigen projekten die nützliche __autoload funktion nutzte und noch nicht so richtig raus habe wie ich das mit namespaces kombinieren soll -.-
vielleicht gibt es ja auch dazu noch ein tip ? ;)
Aber auf jedenfall eine super sache mit dem blog, auch wenn ich kein wirklicher blog-freund bin ;)
Gruß,
Dorian
Kommentar schreiben