Wir machen mal ein Rollenspiel, du bist der Programmierer und hättest dieses Programm geschrieben, ich bin der Typchecker.
function ints (int ...$rest) : array {
return $rest;
}
var_export(ints(1,2,3));
var_export(ints('foo'));
Du: „Ey Typchecker, ist das Programm korrekt getypt?“
Ich: „Nope, denn das Argument 'foo'
in dem Ausdruck ints('foo')
ist vom Typ string
, aber ich hätte da einen int
-Wert erwartet. Wenn du das nicht behebst bevor einer das Programm ausführt, könnte es hier zu einem Laufzeit-Fehler kommen.“
Du: „Ich verstehe. Und wenn ich 'foo'
durch 42
ersetze?“
Ich: „Dann hab ich nichts weiter zu meckern. Wenn das Programm jetzt ausgeführt wird, gibt es keinen Typfehler zur Laufzeit.“
Du: „Wow, und das kannst du sehen ohne das Programm selber auszuführen?“
Ich: „Ja, ich gucke mir nur den Syntax-Baum an.“
Du: „Danke.“
Ich: „Nicht dafür.“
Und nun zurück zu deiner Antwort:
Hab grad Deinen Code getestet: Er wirft eine Exception:
Uncaught TypeError: Argument 1 passed .... thrown.
Du hast also das Programm ausgeführt, obwohl der Typchecker dir prophezeit hat, dass das Programm fehlerhaft ist und es zu einem Laufzeit-Typfehler kommen kann, wenn du den Fehler nicht behebst. Und es ist genau das eingetreten, was der Typchecker dir gesagt hat.