declare(strict_types=1)とはなにか?
結論から言うと、型チェックの設定です。
記載することで、型宣言に正確に対応する値のみを受け入れ、それ以外の場合はエラーを返すようになります。
なぜ型チェックの設定が必要なのか?
PHPではデフォルトで暗黙の型変換が行われるためです。
デフォルトでは、PHP は誤った型の値を 可能であれば期待されたスカラー型の宣言に従うよう自動的に変換します(coercive モード)。 たとえば、関数に int が与えられたが、 パラメータで文字列が期待されていた場合、文字列型の値を取得します。
https://www.php.net/manual/ja/language.types.declarations.php#language.types.declarations.strict
以下コードは、二つの引数を足し算するメソッドですが、$value1
は文字列型となっています。
declare(strict_types=1);
の記載をすることで型不正エラーとなります。
(記載がなければ暗黙の型変換が行われ、計算結果が表示されます。)
<?php
declare(strict_types=1);
$value1 = '0';
$value2 = 1;
echo addition($value1,$value2);
function addition(float $value1, float $value2): float
{
return $value1 + $value2;
}
実行結果
Fatal error: Uncaught TypeError: addition(): Argument #1 ($value1) must be of type float, string given, called in php-wasm run script on line 7 and defined in php-wasm run script:9 Stack trace: #0 php-wasm run script(7): addition('0', 1) #1 {main} thrown in php-wasm run script on line 9
まとめ
PHPでは暗黙の型変換が行われるため、厳密な型チェックを行いたい場合はdeclare(strict_types=1)を記載する。
参考
PHP: declare - Manual
PHP: 型宣言 - Manual