Rolf b: PHP: Vorerst keine Union-Types.

Beitrag lesen

PHP ist traditionell eine deklarationsarme Sprache, in PHP 5 kamen die Type-Hints und in 7 die MÖGLICHKEIT zur Typdeklaration mit strikter Prüfung hinzu. Algebraische Typen sind für die Maintainer von PHP vermutlich noch weit weg. Ob die strikten Typen, die PHP 7 kennt, den Compiler dazu bewegen, weniger Laufzeitprüfungen auf korrekte Wertetypen durchzuführen, wäre auch erstmal zu betrachten. Jedenfalls nicht mit dem Standard PHP-to-OpCode Compiler auf eine ZEND Engine. Hack mit HHVM hat einen JIT, der strikte Typisierung besser ausnutzen kann. Ich weiß nicht womit ZEND Geld verdient und ob es ihnen gut geht, aber eine JIT-fähige Engine, die auch noch multiplatform funktioniert, ist aufwändig.

Andererseits, wenn ich mir den Proposal anschaue, ist der vorgeschlagene Anwendungszweck zumindest teilweise schrecklich. Es gibt Funktionen, die geben ein Objekt zurück oder FALSE im Fall eines Errors. Das können sie nur, weil Variablen in PHP prinzipiell ungetypt sind. Es kennt zwar Wertetypen, aber Variablen können erstmal alles speichern. Eine Funktion, die je nach Ergebnis einen anderen Wertetyp liefert, ist aus meiner Sicht der komplette Horror. Dazu noch mit der automatischen truthy/falsy Interpretation von non-boolean Werten, und dem Zwang, zwischen der Rückgabe eines falsy-Wertes und echtem FALSE unterscheiden zu müssen. Solche Funktionen gehören auf den Misthaufen der Geschichte, und sie gehören nicht dadurch konserviert, dass man ihre Rückgaben mittels Union-Typisierung veredelt. Ein Rückgabetyp "int | false" ist meiner Meinung nach ein Designfehler. Eine Typisierung "ClassXYZ | null" ist auch nicht viel besser. Was fehlt, ist ein klarer Mechanismus zur Rückgabe von zwei Werten, und der Möglichkeit, das auch deklarieren zu können.

($result, $success) = function($blah);

Etwas ähnliches kann ich PHP zwar bauen:

list($result, $success) = function($blah);

und ich gebe ARRAY(1, true) aus der Funktion zurück, aber es ist eben handgemacht und vom Compiler nicht überprüfbar. Wenn ich schreiben könnte:

function blah(int $fasel) : (ClassXYZ, boolean) 
{
   return (new ClassXYZ($fasel), true);
}

das wär mal was. Aber sowas geht nicht und es gibt nicht mal einen RfC dafür. Oder übersehe ich etwas, außer Referenz-Parametern als Ersatz für out-Parameter?

Das, was algebraische Typen sein KÖNNEN - soweit ich das aus dem englischen Wikipedia-Artikel herauslese - ist etwas ganz anderes. Ob das für PHP machbar ist, ohne Compiler und Runtime komplett neu zu schreiben, wäre erstmal zu überlegen. Von daher: 100% dafür, die Idee in dieser Formulierung abzulehnen.

Gruß
Rolf