はじめに
PHP8 の関数やメソッドでは、引数や戻り値に型を指定できます。さらに declare(strict_types=1);
を記述するかどうかで、型の扱いが大きく変わります。本記事では、通常モードと strict モードの違いをサンプルコードと実行結果を比較しながら整理します。さらに nullable 型を使った null 許容の方法も紹介します。
目次
型指定と strict_types の基本
- 関数やメソッドの引数・戻り値に型を指定可能
declare(strict_types=1);
の有無で動作が変わる- 通常モード:スカラー値は弱い型変換が行われる
- strictモード:型は完全一致でなければならない
サンプルコード
class Hoge {
public function test(int $i, string $s, int $n) {
var_dump($i, $s, $n);
}
}
$obj = new Hoge();
$obj->test('123', 999, null);
実行結果の比較表
モード | 第1引数 '123' → int $i | 第2引数 999 → string $s | 第3引数 null → int $n | 実行結果 |
---|---|---|---|---|
通常モード(strict_typesなし) | 自動変換されて int(123) | 自動変換されて string(3) "999" | 変換不可 → TypeError | Fatal error: Argument #3 must be of type int, null given |
strictモード(declare(strict_types=1) | 変換されずエラー(string を int に渡せない) | (ここに到達しない) | (ここに到達しない) | Fatal error: Argument #1 must be of type int, string given |
nullable 型で null を受け入れる
null を渡す可能性がある場合は、nullable 型 を使います。?
を型の前に付けるだけです。
class Hoge {
public function test(int $i, string $s, ?int $n) {
var_dump($i, $s, $n);
}
}
$obj = new Hoge();
$obj->test(123, '999', null);
実行結果(strict モードでもOK):
int(123)
string(3) "999"
NULL
- nullable 型を使えば strict モードでも null を安全に渡せる
- PHP8 上級試験でも押さえておきたいポイント
試験対策ポイント
- 通常モード → 弱い型変換あり、null は型に合わなければエラー
- strictモード → 弱い型変換なし、完全一致が必要
- null を許容する場合は
?型
を使う - 「null は例外的に受け入れられる」という説明は誤り
まとめ
- 通常モード → 弱い型変換が働く
- strictモード → 型が完全一致していないと即 TypeError
- null を扱う場合は nullable 型
?型
を使うことが安全 - 試験対策としても、nullable 型の理解は必須