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.
 nicht angemeldet
 nicht angemeldet Rolf b
 Rolf b