型宣言関数のパラメータや戻り値、 クラスのプロパティ (PHP 7.4.0 以降)、クラス定数 (PHP 8.3.0 以降) に対して型を宣言することができます。 これによって、その値がコール時に特定の型であることを保証できます。 その型でない場合は、TypeError がスローされます。 PHP がサポートしている単一の型それぞれを、 ユーザーが行う型宣言の中で使うことができます。 但し、resource 型を除きます。 このページでは、それぞれの型がいつ利用可能になったかの変更履歴や、 型宣言におけるそれらの使い方について記しています。
変更履歴
基本型を使うときの注意基本型は、ここで説明する小さな注意事項はいくつかあるものの、 わかりやすい振る舞いをします。 スカラー型警告
スカラー型(bool, int,
float, string) のエイリアスはサポートされていません。
つまり、これらはクラスやインターフェイスの名前として扱われているということです。
たとえば、型の宣言に
上の例の PHP 8 での出力は、このようになります。: Warning: "boolean" will be interpreted as a class name. Did you mean "bool"? Write "\boolean" to suppress this warning in /in/9YrUX on line 2 Fatal error: Uncaught TypeError: test(): Argument #1 ($param) must be of type boolean, bool given, called in - on line 3 and defined in -:2 Stack trace: #0 -(3): test(true) #1 {main} thrown in - on line 2 void
Callableこの型は、クラスのプロパティの型宣言では使うことができません。
リファレンス渡しのパラメータに対する型宣言リファレンス渡しのパラメータに対して宣言される型は、 関数の入り口で だけ チェックされます。 しかし、関数から返される時はチェックされません。 これは、変数のリファレンスについては、関数が型を変更できるということです。 例1 リファレンス渡しのパラメータに対する型宣言
上の例の出力は、 たとえば以下のようになります。 int(1) Fatal error: Uncaught TypeError: array_baz(): Argument #1 ($param) must be of type array, int given, called in - on line 9 and defined in -:2 Stack trace: #0 -(9): array_baz(1) #1 {main} thrown in - on line 2 複合型を使うときの注意複合型を宣言する場合、制限がいくつか存在します。 また、簡単なバグを防ぐために、型の冗長チェックがコンパイル時に行われます。 警告
PHP 8.2.0 より前のバージョン、 つまり DNF 型がサポートされる前は、 交差型とunion型を組み合わせることはできませんでした。 union 型警告
union 型の中で、Value型 警告
PHP 8.2.0 より前のバージョンでは、
nullable な型とシンタックスシュガー
単一の基本型を宣言した場合、
型の名前の前にクエスチョンマーク (
重複した冗長な型複合型の宣言に関する単純なバグを見つけるため、 クラスの読み込みを行わずに検出できる冗長な型はコンパイル時にエラーになります。 たとえば、以下のような場合です:
たとえば、
例例3 クラスによる型宣言の基本
上の例の PHP 8 での出力は、このようになります。: C D Fatal error: Uncaught TypeError: f(): Argument #1 ($c) must be of type C, E given, called in /in/gLonb on line 14 and defined in /in/gLonb:8 Stack trace: #0 -(14): f(Object(E)) #1 {main} thrown in - on line 8 例4 インターフェイスによる型宣言の基本
上の例の PHP 8 での出力は、このようになります。: C Fatal error: Uncaught TypeError: f(): Argument #1 ($i) must be of type I, E given, called in - on line 13 and defined in -:8 Stack trace: #0 -(13): f(Object(E)) #1 {main} thrown in - on line 8 例5 基本的な戻り値の型宣言
上の例の出力は以下となります。 float(3) 例6 オブジェクトを返す
上の例の出力は以下となります。 object(C)#1 (0) { } 例7 Null を許容する型宣言
上の例の出力は以下となります。 object(C)#1 (0) { } NULL 例8 Null を許容する戻り値の型宣言
例9 クラスのプロパティで型宣言
厳密な型付けデフォルトでは、PHP は誤った型の値を 可能であれば期待されたスカラー型の宣言に従うよう自動的に変換します(coercive モード)。 たとえば、関数に int が与えられたが、 パラメータで文字列が期待されていた場合、文字列型の値を取得します。 ファイルごとに strict モードを有効にすることができます。 strict モードでは、型宣言に正確に対応する値のみを受け入れ、 それ以外の値の場合、TypeError がスローされます。 このルールに関する唯一の例外は、int の値が float 型の宣言に渡せることだけです。 警告
内部関数の中からの関数呼び出しは、
strict モードを有効にするには、
例10 引数の値に対する厳密な型付け
上の例の PHP 8 での出力は、このようになります。: int(3) Fatal error: Uncaught TypeError: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 9 and defined in -:4 Stack trace: #0 -(9): sum(1.5, 2.5) #1 {main} thrown in - on line 4 例11 引数の値に対する型の自動変換
上の例の出力は以下となります。 int(3) int(3) 例12 戻り値に対する厳密な型付け
上の例の出力は以下となります。 int(3) Fatal error: Uncaught TypeError: sum(): Return value must be of type int, float returned in -:5 Stack trace: #0 -(9): sum(1, 2.5) #1 {main} thrown in - on line 5 |