これまでしてこなかった型宣言について
公式の内容を纏めて自分なりに解釈してみました。
参考: PHP.net
なぜ型宣言をするのか?
そもそもの型宣言とはなにか?
関数のパラメータや戻り値、 クラスのプロパティ (PHP 7.4.0 以降) に対して型を宣言することができます。 これによって、その値が特定の型であることを保証できます。 その型でない場合は、TypeErrorがスローされます。
自分なりに解釈すると
パラメータや戻り値が定義されていることで求めた型以外が参照された場合に
エラーを返すことによって大きなバグになることを事前に防いでいるのかと考えます。
またバグ出た際の原因追求もしやすくなるのかなと思います。
わかりやすく言うと
スーパーとかがイメージしやすいのかなと!
お酒コーナーにはお酒をおいてあるのでそこから持ち出したら
もちろんお酒を持っていくことになりますよね!
お菓子コーナーから商品を持ち出したらそれはもちろんお菓子です。
そのメソッドを使ってどんな反応が返ってくるのか
その範囲、カテゴリを指定することでおおよその返り値を想定することが出来る。
そんなイメージがわかりやすいかなと思います。
基本的な型
型 | 説明 | ver |
---|---|---|
クラス/インターフェイスの名前 | 値が指定したクラスやインターフェイスのインスタンでなければいけません。 | |
self | 値がそのメソッドが定義されているクラスと同じクラスのインスタンスでなければいけません。クラスの内部でのみ使えます。 | |
array | 値が配列でなければいけません。 | |
callable | 値がcallableでなければいけません。クラスのプロパティの型では宣言できません。 | |
bool | 値がbool値でなければいけません。 | |
float | 値がfloatでなければいけません。 | |
int | 値がintでなければいけません。 | |
string | 値が文字列でなければいけません。 | |
iterable | 値が配列か、Traversableのインスタンスでなければなりません。 | PHP 7.1.0以降 |
object | 値がobjectでなければなりません。 | PHP 7.2.0以降 |
mixed | 値はあらゆる値であることが出来ます。 | PHP 8.0.0以降 |
※union型
型をunionとして宣言するとひとつではなく複数の異なる型を値として受け入れることが出来る。
<?php
function getItem(): T1|T2...
{
//返り値はT1|T2となる
}
※mixed型
mixed型は
array|bool|callable|int|float|object|resource|string|null
と同等の型です。
Nullを許容する型宣言
型の名前の前にクエスチョンマークを付けることで
返り値がnullである場合も許容される
<?php
function getItem(): ?string
{
//返り値はnull|stringのどちらかである
}
返り値でのみ有効な型
void
voidは関数が値を返さないことを示す戻り値の型
static
値が、メソッドが呼び出されているクラスと同じインスタンスでなければいけない。
型宣言は完全でもなければ最低限でもない
他の言語のことは知らないのでなんとも言えませんが
型の扱いがゆるいイメージのPHP特有なのか
型宣言をしたからと言って必ずしもその型で扱われているとも限らない
わかりやすい例でコードを書くと
<?php
function getItem(): int|string
{
//
return true;
}
上記のコードでは
true = 1
とした扱いになり
intとboolは互換性がありエラーとはならないので
型を定義したのであればしっかりと定義した型で
返してあげるようにしたほうがいいかと思います。