LoginSignup
1
0

More than 1 year has passed since last update.

PHP declare(strict_types=1)ってなんだ!?

Last updated at Posted at 2022-05-17

概要

  • 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モード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が自動で行ってくれている型変換を一切行わず、型が一致していないとエラーになるのでバグの出にくいコードが書ける!

情報追記


参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0