1unitedpower: 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.

Ja sieht so aus. Die englische Dokumentation verweist an der Stelle "Type Hinting" indes auf "Type Declarations".

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.

Wieso wären Exceptions sauberer? Exceptions werden zur Laufzeit geworfen, typannotierte Ausdrücke können mit statischer Programmanalyse zur Entwicklungszeit auf Typfehler überprüft werden. Das hat ein paar Voteile:

  • Das Programm ist zuverlässiger. Eine Exception die nicht behandelt wird, kann zum Programmabsturz führen. Ein falsch getyptes Programm wird vom Typchecker zurückgewiesen.
  • Statische Programmanalyse ermöglicht einen nennenswerten Anteil an Programmierhilfen in Editoren.
  • Library-Autoren können die Fehelbehandlung selbst vornehmen und müssen diese Verantwortung nicht dem Anwender übtertragen. Siehe mein Beispiel.
  • Typen sind auch eine Form der Dokumentation. Sie sollten freilich nicht die einzige Art der Dokumentation sein.
  • Man erhält potenzielle Performance-Boosts durch Einsparung von Laufzeit-Checks. Ob dieses Potenzial ausgeschöpft wird ist eine andere Frage, es eröffnet auf jeden Fall die Möglichkeit für neue Optimierungen.

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.

Inwiefern anders?

(...) 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.

Nein tue ich nicht. Unter einem Variablentypen verstehst du offenbar den durch eine Typannotation festgelegten Typ einer Variablen. Unter Wertetyp verstehst du den ermittelten Typen eines Wertes. Den ermittelten Typen eines Wertes mit der Typannotation auf Kompatibilität zu überprüfen ist Aufgabe eines Typcheckers.

Und gerade hier liegt der Mehrwert von Union-Types: Sie ermöglichen neue Typannotationen und dadurch mehr statische Typchecks. Keine Notwendigkeit für Exceptions.

Natürlich hat der WERT dann einen Typ. Aber die Variable ist nicht auf einen Typ beschränkt.

Das ist nur die halbe Wahrheit. Für Parameter lassen sich Typannotationen angeben, für andere Variablen-Deklarationen aber nicht.