PHP で型をちゃんと使いたいなら declare(struct_types=1) 宣言しよ?

1 min read読了の目安(約800字
<?php

function i(int: $n): int {
    return $n;
}

function f(float: $n): float {
    return $n;
}

$num = 1.1;

print_r([i($num), f($num)]);
// [1, 1.1]

float を返す箇所の返り値の型を :int って書くと暗黙的に型変換されてしまう。結果 1.11 になる。
function f(float: $n)function f(int: $n) って書いても 1.1 -> 1 に変換されてしまう。

これを防ぎたいならちゃんと値が int か float か確かめてからコード書こう、という気持ち自体は大切にしつつも、
本質的にはせっかく書いた型情報に守られて生きていきたいので declare(strict_types=1); を追加するのが正解

<?php

declare(strict_types=1); // ここが差分

function i(int: $n): int {
    return $n;
}

function f(float: $n): float {
    return $n;
}

$num = 1.1;

print_r([i($num), f($num)]);
// PHP Fatal error:  Uncaught TypeError: Argument 1 passed to i() must be of the type int, float given, called in /Users/bko/test.php on line 15 and defined in /Users/bko/test.php:5
// Stack trace:
// #0 /Users/bko/test.php(15): i()
// #1 {main}

つらい