Rolf b: PHP: Vorerst keine Union-Types.

Beitrag lesen

Scheint, als ob die PHP Doku inkonsistent ist. Unter "Type Hinting" im OOP Bereich findet man noch, dass skalare Hints nicht möglich seine. Unter "Type Declarations" bei den Funktionsargumenten steht, dass es geht.

Wenn schon, dann doch bitte so:

function error_free_divide(int $a, int $b) : float|bool {
   return $b === 0 ? false : $a / $b;
}

Aber hier ist wieder mal ein typischer PHP Fall aus der Mottenkiste: Weil es vor PHP 5.1 keine Exceptions gab, hat man sich behelfen müssen und diese Typensuppe gekocht. KORREKT im Sinne von sauberer Programmierung wäre im Falle unserer Divide-Funktion eine Exception gewesen. Die SPL bietet ein paar an, wie InvalidArgument, Overflow oder UnexpectedValue, auch wenn die nicht richtig passen. Eine DivideByZeroException wäre korrekt. Aber scheinbar sieht der ZEND Coding Standard das ja anders.

Im Falle der MYSQLI-Funktionen wie mysqli::query, die ein Objekt oder false zurückgeben, hätte man eine SqlException definieren müssen. Das bricht nur allen alten Code, deshalb tut man es nicht. Aus Sicht eines sauberen Designs ist ein mixed Returntype trotzdem Unfug.

Wenn es wie in Haskell geschieht und ich einen Union-Typ nutze, um z.B. bei einem Baum einen Knoten oder ein Blatt zurückzugeben (was in C++, C# oder Java ein ITreeNode Interfacetyp wäre), ist das was ganz anderes.

BTW:

(...) weil Variablen in PHP prinzipiell ungetypt sind. <1unitedpower> (Das) ist aber ein Fehlschluss.

Nein. Du verwechselst nur Variablentyp mit Wertetyp. Ich kann in einer PHP Variable jeden Wert speichern. Natürlich hat der WERT dann einen Typ. Aber die Variable ist nicht auf einen Typ beschränkt. D.h. die ZEND Engine muss zur Laufzeit prüfen, welcher Typ nun wirklich vorliegt. Auch Type Declarations einer Funktion oder Methode können erst zur Laufzeit geprüft werden. Eigentümlich finde ich, dass auf der RfC Seite von PHP kein Mensch daran denkt, getypte Variablen einzuführen.

Rolf