WAT

Ich bin gerade dabei, das Wiki hier etwas zu erweitern.

Eine meiner Wunschfunktionen ist es, direkt auf Dateien verlinken zu können – standardmäßig wird ja immer auf die Datei-Seite der Wiki verlinkt, wo man zwar die letzten Revisionen sieht, aber ehrlich: wen interessiert das?

Wie dem auch sei, die Parser-Extension ist eigentlich relativ schnell geschrieben, trotzdem musste ich dabei an Gery Bernhardts Kurzvortrag „WAT“ denken.

PHP geht zwar schnell, ist aber oft nicht unbedingt schön. Nicht ohne Grund gibt es in den Heise-Foren bei nahezu jedem Artikel über PHP einen riesigen Flamewar über die Sprache. Zugegebenermaßen, an einigen Stellen ist die Sprache ziemlich großer Mist – als kleiner Beweis sei dieses hier angeführt:

if("1" == 1)
{
	echo "aww shit!";
}

Ratet mal, was da raus kommt… (kleiner Tipp, es fängt mit „aww“ an und hört mit „shit!“ auf). Um typenstarke Vergleiche anzustellen, muss man === (oder !==) verwenden. Das muss man wissen und so ziemlich jeder ist durch dieses Schlagloch schon durchgefahren.

Was mich aber bei Weitem mehr ankotzt ist folgendes: Fehlerbehandlung. PHP hat ja ganz klein ohne Objektorientierung angefangen und ist dann nach und nach gewachsen. Leider gab es damals noch keine try/catch-Blöcke und man musste alle Fehler über @-Modifier und anderweitige Fehlerüberprüfungen abfangen. Dieser Zopf wurde bis jetzt nie so richtig abgeschnitten und man muss auch heute noch mit @ abfangen.

Dieser Codeblock kann aufgrund zweier Dinge wunderschön gegen die Wand fahren:

try {
	$file = wfFindFile($input, array('time' => false, 'ignoreRedirect' => false));
	$filename = "";

	if($file !== null)
		$filename = $file->getURL();

	return "<a href=\">" . $input . "</a>";

} catch(Exception $ex) {
	echo "oops!";
	return false;
}

(zur Info: in $file wird bei Erfolg ein Objekt zugeordnet)
Eigentlich würde man ja denken, dass bei wfFindFile – da im Erfolgsfall ein Objekt zurückgegeben wird – entweder ein Objekt oder null zurückgegeben wird. Wird es nicht, aber das ist ein (meiner Meinung) Fehler der MediaWiki-Programmierer. Mein Fehler war, darauf zu vertrauen und typenstark mit null zu vergleichen. Hätte ich typenschwach ($file != null) verglichen, hätte das Ding funktioniert.

Nun kommt aber der richtig große Mist: in $file steckt, wenn’s dumm kommt, kein Objekt sondern false. Bei einem Boolean wird es natürlich etwas schwierig, die Methode getURL(); aufzurufen. Anstatt dass nun die Exception ausgelöst wird, tritt der alteingesessene Errorhandler auf den Plan und wirf den Anker von Bord.

WAT!?!