🤢
PHP で型をちゃんと使いたいなら declare(struct_types=1) 宣言しよ?
<?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.1
が 1
になる。
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}
つらい
Discussion