generated at
declare(strict types=1)
PHPの型はdefaultでは弱い型付け
declare(strict types=1) によって暗黙castを防ぐ
ただし色々気をつける点がある
PHP Intelephenseのエラーの種類も変わる
厳し目になる


declare(strict_types=1)
php
declare(strict_types=1);
暗黙のcastを防ぐ



挙動の変化を見る
i() f() も引数をそのまま返す関数
返り値の型を指定することで暗黙castが行われる
php
function i(int $n): int { return $n; } function f(float $n): float { return $n; } $num = 1.1; dump(i($num)); // 1 ←そのまま返しているのにcastされている dump(f($num)); // 1.1
strict_typesを付けるとエラーが表示される
PHP Intelephenseによって、VSCode上にも表示されるし
実行時にもエラーが出される
php
declare(strict_types=1); // これを加えた function i(int $n): int { return $n; } function f(float $n): float { return $n; } $num = 1.1; dump(i($num)); // error: Expected type 'int'. Found 'float' dump(f($num));
実行時にも Type error: Argument 1 passed to .. must be of the type integer, float given, called in のようなエラーが表示される
しかし、これは実行されなければ実行時エラーは出ない
php
declare(strict_types=1); if(false){ // さっきのコード }


気をつける
「既に大量に書かれたPHPコードがあるファイル」に
あとからstrict_typesを付け加えるのは、かなり怖い
「暗黙cast」をしている部分が一箇所もなければ大丈夫
「そのファイル内の全関数が返り値の型を指定していない」でも大丈夫なのか
少なくとも「型エラーを全消しした状態」にしないと付け加えたくない
TSの漸進的型付けと違って、ランタイムに挙動の差が生じる
でも新しく書く場合ならこっちの方がいいのかもなmrsekut