DOMDocument::ConfuseMe();
Ich möchte nicht den Eindruck erwecken, als wäre ich auf Kriegsfuß mit PHP – immerhin habe ich es als die Programmiersprache gewählt mit der ich meine Brötchen verdiene. Jedoch sind manche Eigenschaften der Sprache und der API wirklich skuril.
Wie Nils ja auch schon aufgezeigt hat, ist eine der merkwürdigsten Klassen von PHP sicherlich DOMDocument. Dem möchte ich mich anschließen und auch mich etwas darüber auslassen.
Oft habe ich bei PHP das Gefühl, dass sich die PHP-Entwickler nicht komplett von der prozeduralen Entwicklung lösen wollen, sondern es auch den Entwicklern recht machen wollen, die mit Objektorientierung nichts am Hut haben.
So kann die DOMDocument-Methode LoadXML (die XML-Daten aus einem String lädt) beispielsweise auf zwei verschiedene Arten aufgerufen werden:
- Über einen statischen Aufruf der Methode DOMDocument::LoadXML( $string )
- Über den Aufruf der Methode als Instanzmethode: $document->LoadXML( $string )
Die Dokumentation verrät, dass der „Return-Typ“ der Methode mixed ist.
Bei einem statischen Aufruf der Methode wird eine Instanz der Klasse erzeugt, das XML geladen und das neu erzeugte Objekt zurückgegeben. Bei einem Aufruf der Instanzmethode hingegen wird das XML geladen und als Boolean-Wert zurückgegeben, ob das XML geladen werden konnte.
- Weshalb verwenden Bibliotheken im Zeitalter der Objektorientierung den „Datentyp“ mixed? Widerspricht das nicht jedem Ansatz der Objektorientierung?
- Werden PHP-Entwickler nun ermutigt, unterschiedliche Implementierungen für Methoden abhängig davon, ob sie statisch oder auf eine Instanz aufgerufen wurden, zu machen? Sollte die API der Programmiersprache nicht viel mehr Vorbild für die Entwickler sein?
- Werden Anwender meiner API nun auch versuchen, meine Methode statisch aufzurufen, um zu schauen, ob sie besondere Features entdecken? (Und Bugs, die auftreten können weil PHP sich komisch bei statischen Calls auf Instanzmethoden verhält)
- Vorteile wie IDE Code Completion fallen natürlich auch weg, weil solche Spezialfälle wohl keiner normalen IDE beigebracht werden können. (Diese Aussage gilt für Eclipse natürlich nur unter Vorbehalt)
- Der Output von PHPDocumentor usw. wird sicherlich nicht schöner durch solche Konstrukte
Dabei hätte man einfach konsequenterweise den statischen Aufruf verzichten können. Das, jedoch würde implizieren, dass man von PHP-Entwicklern erwarten kann, dass sie das Schlüsselwort new verwenden.
Ich wünsche mir eine Welt, in der PHP-Entwicklern zugetraut wird, OOP richtig zu praktizieren und in der mixed nicht existiert.
Moins,
der Aufruf von DomDocument::load* führt zu einem E_STRICT. Daraus lässt sich imho schon deutlich erkennen, dass diese Art des Aufrufs – selbst wenn er als gültig dokumentiert ist – technisch nicht sauber ist.
Ob ein statischer Aufruf ansich ein Problem darstellt, das sogar zu „nicht richtigem“ OOP führt, würde ich jetzt allerdings nicht so unterschreiben. Lediglich die Tatsache, dass die gleiche Methode je nach Aufruf-Context sich anders verhält ist unschön und mit Sicherheit unsauber.
CYA Arne
Danke, Daniel 🙂