PHP wird ja oft als dreckige Skriptsprache mit Objektorientierung-Anhang bezeichnet. Natürlich kann man das tun - man kann dreckige, sich gegenseitig includende Skripte schreiben. Am Ende wirds bestimmt auch funktionieren. Wartbarkeit ist dann was anderes.
Aber darüber wollte ich hier eigentlich gar nichts schreiben.
Ich wollte hier behaupten: Man kann in PHP ähnlich elegant und schön wie in Java (oder C#) programmieren.
Der Umstand, der mich zu dieser Behauptung hinreißt, ist der, dass man vor Autoloadern in PHP 5 Klassen manuell includen musste. Dies führte zu unglaublich hässlichen Codeblöcken. Sollte man seine Projektstruktur nicht entsprechend aufbauen (oder nicht objektorientiert programmieren), ist man auch noch in PHP 5 zu solchen Konstrukten gezwungen.
Hier mal ein Hinweis an diejenigen, die von dieser Möglichkeit noch nichts gehört haben:
Namespaces werden in PHP mit Backslashes geschrieben.
In Java sähe ein voll qualifizierter Klassenname zum Beispiel so aus:
Das PHP-Pendant wäre folgendes:
Nun kann man, wie in Java, die Projektstruktur so aufbauen, dass die Namespaceangabe der Klasse gleich dem Pfad zur Klasse ist.
Nehmen wir wieder die PHP-Klassenangabe von oben, sähe die Projektstruktur beispielsweise wie folgt aus:
root
de
joshavg
php
TolleKlasse.php
In der Datei TolleKlasse.php steckt in diesem Fall dann die Klassendefinition für die Klasse TolleKlasse. Zum Beispiel:
Auf diese Weise kann man dann eine Autoloader-Funktion implementieren, die sich auf genau diese Konventionen stützt. Am besten nutzt man in diesem Fall die Funktion spl_autoload_register(callback(classname)), da man auf diese Weise mehrere Autoloader definieren kann. Definiert man nur eine Funktion __autoload(classname), können Bibliotheken von Drittanbietern keine Autloader mehr definieren.
Zum Beispiel kann man folgende Codezeilen an den Anfang seiner index.php stellen:
Da man den Klassennamen inklusive Namespaceangabe erhält, kann man so auf den Speicherort der Klassendefinition schließen.
Durch das str_replace geht man sicher, dass die Pfadangabe auch wirklich zum aktuellen Betriebssystem passt. Ich habe schon oft gesehen, dass es auch ohne funktioniert, aber sicher ist sicher.
Die Klasse TolleKlasse kann man jetzt wie folgt verwenden:
[code=php]<?php
namespace de\joshavg\php\irgendEinPackage;
use de\joshavg\php\TolleKlasse;
class IrgendEineKlasse {
public function run() {
new TolleKlasse(); // Erzeugt den Output 'Yeah, Konstruktor'
}
}[/code]
Auf diese Weise schreibt man maximal ein paar includes, eins pro Autoloader, programmiert viel flüssiger (vernünftige IDE vorausgesetzt) und kann seine Klassen ordentlich strukturiert ablegen.