😡

【PHP】PHPでも静的型付けっぽい使い方をしたい😭⇦厳格モードがあります!

2022/11/26に公開

はじめに

「戻り値の型を指定したのに、勝手にキャストされたくない😡」
「エラーを吐いてくれないせいで、不具合の原因究明に時間がかかってしまった;;」

そんなことはないでしょうか?

今回はPHPで厳格モードを使用する方法から、使用しない場合phpがどのくらいゆるゆるな挙動をするかについて解説させていただきます。
ファイル一つだけ厳格モードにすることもできるので、元々のPHPの手軽さも残しながら、重要な箇所のみ厳格モードで記述することができます🤗

この記事を見るメリット

  • 厳格モードについて理解できる
  • PHPの型の挙動がわかる
  • 厳格モードのエラーのおかげで不具合が起きにくくなる!

対象者

この記事は下記のような人を対象にしています。

  • プログラミング初学者
  • 駆け出しエンジニア
  • PHPを固く使用したい人
  • PHPの型の挙動に惑わされる人

結論

ファイルの先頭の<?phpの下に以下の記述を追加するだけ!

これを追加するだけでそのファイルが厳格モードで実行されるようになる!
declare(strict_types=1)

解説

厳格モードについてや、通常の場合との挙動の違いについても解説させていただきます!

厳格モード declare(strict_types=1)について

PHPが自動で行う型変換を禁止し、指定したファイル全体を通して型指定を厳格にチェックする設定。
本来エラーにならずPHPが型を勝手に変換することでエラーにならなかった箇所がエラーになるので、型変換による意図しない挙動を防ぐことができる。

厳格モードあり/なしで動作する際のPHPの挙動

厳格モードを使用しない場合は以下のような挙動になります。

// Bool型で返す宣言
function execute1(): bool
{
    return 1;
}

// 数値型で返す宣言
function execute2(): int
{
    return true;
}

// 文字列で返す宣言
function execute3(): string
{
    return true;
}

var_dump(execute1());
var_dump(execute2());
var_dump(execute3());
出力結果
bool(true)
int(1)
string(1) "1"

戻り値の型を宣言しているのにエラーになりません。。。

ただし戻り値をintにし、数字以外の文字列を返す場合などでようやくエラーになります。

function execute4 (): int
{
     return 'a';
}

var_dump(execute4());
出力結果
PHP Fatal error:  Uncaught TypeError: execute4(): 
Return value must be of type int, string returned

PHPのよい所でもありますが、型変換を行いたくない場合などもあると思います。
今度はdeclare(strict_types=1)を足した場合の挙動も見てみましょう!

declare(strict_types=1);

// Bool型で返す宣言
function execute1(): bool
{
    return 1;
}

// 数値型で返す宣言
function execute2(): int
{
    return true;
}

// 文字列で返す宣言
function execute3(): string
{
    return true;
}

var_dump(execute1());
var_dump(execute2());
var_dump(execute3());
出力結果
PHP Fatal error:  Uncaught TypeError: execute1(): 
Return value must be of type bool, int returned

PHP Fatal error:  Uncaught TypeError: execute2(): 
Return value must be of type int, bool returned

PHP Fatal error:  Uncaught TypeError: execute3(): 
Return value must be of type string, bool returned

通常の場合は、全て通っていた関数が全てエラーになりました。
厳格モードを有効にすることで、戻り値の型宣言が静的型付け言語並みになります!

まとめ

  • 通常はPHPがよしなに型を変換してくれる
  • 厳格モードを有効にしたい場合は、ファイルの先頭にdeclare(strict_types=1)を追加する
  • 厳格モードを有効にすると、自動の型変換がされなくなりエラーを吐いてくれる
  • 厳格モードの有効範囲は、require関係なく宣言したファイルのみ

おわりに

今回はPHPの厳格モーについてと、厳格モードあり/なしそれぞれの挙動を解説させていただきました!
ファイルの先頭に追加するだけで、いつでもON・OFFを切り替えることができるので、試しに使用してみるのもいいかもしれませんね😊

最後まで記事を見てくださりありがとうございました。
誤字や脱字、コードのリファクタリングできる箇所などがありましたらコメントくださるとありがたいです!
また、いいねをしてくださると、筆者が喜びます:)

Discussion