概要
- PHPのコードにてファイルを作成したらnamespaseの宣言の前に呪文の様に
declare(strict_types=1);
と記載していた。詳しく意味を知りたかったのでまとめる。
調べてみた
- 公式ドキュメントでは下記の様に記載されている。
declare 文は、あるコードブロックの中に 実行ディレクティブをセットするために使用します。declare の文法は他の制御構造と似ています。
- 簡単に言うとコンパイルするときの指示らしい
ディレクティブ の箇所で、セットされた declareブロックの挙動を指定することが出来ます。 現在のところ、使用できるディレクティブは ticks ( ticksに関しては以下を参照ください)、 encoding (encoding に関しては以下を参照ください)、 strict_types (型宣言のページの 厳密な型付け も参照ください) です。
- 「strict_types (型宣言のページの 厳密な型付け も参照ください) 」と記載されているので下記のページを見てみる。
- 上記を読んでみて
declare(strict_types=1)
は「strict モードを有効に設定」という意味出ることがわかった。
デフォルトでは、PHP は誤った型の値を 可能であれば期待されたスカラー型の宣言に従うよう自動的に変換します(coercive モード)。 たとえば、関数に int が与えられたが、 引数に文字列が期待されていた場合、 文字列型の値を取得します。
ファイルごとに strict モードを有効にすることができます。 strict モードでは、型宣言に正確に対応する値のみを受け入れ、 そうでない場合、TypeError がスローされます。 このルールに関する唯一の例外は、int の値が float 型の宣言に渡せることだけです。
- strictモードはファイルごとに設定するようで、当該ファイル内から実施される関数呼び出しに適応される。
- strictモードONのファイル から strictモードOFFのファイルの関数の呼び出し
- 呼び出し先の関数がstrictモードONで呼び出される。
- strictモードOFFのファイル から strictモードONのファイルの関数の呼び出し
- 呼び出し先の関数がstrictモードOFFで呼び出される。
- strictモードONのファイル から strictモードOFFのファイルの関数の呼び出し
じゃあstrictモードON状態ってなんや
- 下記の場合、strictモードONにしないと浮動小数点がPHPによってintに型変換されてエラーなく実行される。
<?php
//declare(strict_types=1);
function sum(int $a, int $b) {
return $a + $b;
}
//int(3)
var_dump(sum(1.5, 2.5));
- コメントアウトされている
declare(strict_types=1);
のコメントアウトを外し実行すると下記の様にエラーになる。
PHP Fatal error: Uncaught TypeError: sum(): Argument #1 ($a) must be of type int, float given, called in /workspace/Main.php on line 8 and defined in /workspace/Main.php:4
- 和訳
PHP致命的なエラー:キャッチされないTypeError:sum():引数#1($ a)は、int型であり、floatが指定され、8行目の/workspace/Main.phpで呼び出され、/workspace/Main.php:4で定義されている必要があります。
まとめ
- declare(strict_types=1);を記載するとPHPが自動で行ってくれている型変換を一切行わず、型が一致していないとエラーになるのでバグの出にくいコードが書ける!
情報追記
- 本内容はPHP7からの機能のようです。