PHPのstrict_types=1とは?型宣言の引数・戻り値チェックがどう変わるのかを徹底解説

PHP

PHPでは、関数やメソッドの引数、戻り値に型宣言を指定することで、意図しないデータ型の受け渡しを防ぐことができます。その中でもdeclare(strict_types=1)は、PHPの型チェックの動作を大きく変える重要な設定です。この記事では、strict_types=1を有効にした場合に引数や戻り値の扱いがどのように変化するのか、具体的なコード例を交えながら解説します。

PHPの型宣言とstrict_types=1の基本

PHPは動的型付け言語であり、通常は変数の型を厳密に指定する必要がありません。しかし、PHP 7以降ではスカラー型や戻り値の型宣言が導入され、より安全なコードを書くことが可能になりました。

例えば、以下のように関数の引数にint型を指定できます。

function add(int $a, int $b): int { return $a + $b; }

ただし、通常のPHPでは型宣言があっても、状況によっては自動的な型変換(型の強制)が行われます。この動作を変更するのがstrict_types=1です。

strict_types=1を有効にすると引数の型チェックが厳密になる

strict_types=1を指定すると、関数やメソッドへ渡す引数について、指定した型と異なる値が渡された場合に自動変換されず、TypeErrorが発生します。

例えば、通常のPHPでは次のようなコードが動作する場合があります。

function showNumber(int $number): void { echo $number; }
showNumber("123");

strict_typesが無効の場合、文字列の”123″は整数の123へ変換され、処理が実行されます。

一方、strict_types=1を有効にすると、文字列は整数へ変換されません。そのため、以下のようなエラーになります。

Fatal error: Uncaught TypeError: showNumber(): Argument #1 ($number) must be of type int, string given

戻り値の型宣言にもstrict_types=1の影響がある

strict_types=1は引数だけではなく、関数やメソッドの戻り値の型チェックにも影響します。

例えば、戻り値をint型として宣言した関数がある場合を考えます。

function getCount(): int { return "10"; }

通常のPHPでは状況によって文字列の”10″が整数10へ変換されることがあります。しかし、strict_types=1では指定した型以外の値を返すとTypeErrorになります。

このため、戻り値についても関数の契約が明確になり、予期しないデータ型の混入を防ぐことができます。

strict_types=1はファイル単位で指定する必要がある

strict_types=1はPHP全体の設定ではなく、declare文を書いたファイル単位で適用されます。

記述する場所はファイルの先頭で、次のように書きます。

<?php
declare(strict_types=1);

function multiply(int $value): int {
return $value * 2;
}

注意点として、呼び出される関数側ではなく、関数を呼び出す側のファイルにstrict_typesの設定が影響します。

例えば、厳密な型チェックをしたい処理では、関連するすべてのファイルでstrict_types=1を利用する設計にすると、型の不一致による問題を早期発見できます。

strict_types=1を使うメリット

strict_types=1の大きなメリットは、データ型の間違いを早い段階で発見できることです。特に大規模なシステムや複数人で開発するプロジェクトでは、予期しない型変換による不具合を防ぐ効果があります。

例えば、ユーザーIDを扱う処理で、本来は整数であるべき値に文字列や空文字が渡された場合、通常のPHPでは意図しない変換が発生する可能性があります。

strict_types=1を利用していれば、そのような問題をTypeErrorとして検出できるため、原因調査や修正が容易になります。

strict_types=1を使う際の注意点

strict_types=1は便利な機能ですが、既存のPHPコードへ突然導入するとエラーが増える可能性があります。特に、型変換を前提に作られた古いコードでは注意が必要です。

例えば、フォーム入力値は基本的に文字列として取得されるため、数値として扱う場合は明示的にキャストやバリデーションを行う必要があります。

新規開発では積極的に利用しやすい一方で、既存システムへ導入する場合は、範囲を限定しながら段階的に適用すると安全です。

まとめ|strict_types=1でPHPの型安全性を高める

PHPのstrict_types=1を有効にすると、関数やメソッドの引数、戻り値で指定した型が厳密にチェックされ、自動的な型変換が行われなくなります。

その結果、型の不一致による予期しない動作を防ぎ、コードの安全性や保守性を向上させることができます。

特にチーム開発や大規模なアプリケーションでは、strict_types=1を活用することで、プログラムの品質向上につながります。ただし、既存コードへ導入する場合は影響範囲を確認しながら慎重に適用することが重要です。

コメント

タイトルとURLをコピーしました