PHP 7.0 から使える型宣言について
PHP 7.0 から関数の引数や戻り値の型宣言が出来るようになりました。
例えば、次のように関数を宣言すると、引数の $name
は 文字列型 (string) として受け取ることを強制できます。この引数に文字列型として受け取れない値を渡すとエラーが発生するようになります。
function dumpName(string $name) {
var_dump($name);
}
型宣言を活用することで、意図しない型の引数が渡される可能性を考慮せずに関数の実装をできるようになります。想定されることが少なく済むほどコードも単純化し、品質の向上に繋がります。
型宣言の制約を上手く活用することがソフトウェアの品質向上への近道と言えます。
NULL 許容型の宣言方法
さて、この便利で頼もしい型宣言の機能ですが、上記のコード例のままだと引数に NULL を渡した場合にエラーとなります。
NULL も渡せる引数型の宣言をするには次の二通りの方法があります。
1. デフォルト値を代用した宣言方法
引数のデフォルト値の指定を代用することで NULL 許容型を表現できます。
引数に NULL を渡した場合でもエラーになることはありません。
この宣言方法は PHP 7.0 から使えます。
function dumpName(string $name = null) {
var_dump($name);
}
2. 専用の nullable 型宣言による宣言方法
型名の前に ?
を追加することで NULL 許容型として宣言できます。
例えば ?int
とすると整数型か NULL のどちらかを受け入れるようになります。
この宣言方法は [PHP 7.1 から使えます] (http://php.net/manual/ja/migration70.new-features.php#migration70.new-features.scalar-type-declarations)。
function dumpName(?string $name) {
var_dump($name);
}
両者の宣言方法の違い
上記の二種類の宣言方法には違いがあります。
それは(そのままですが)デフォルト値があるかどうかです。
一つ目の dumpName(string $name = null)
の宣言の場合、引数に何も渡さなくても $name
にデフォルト値である NULL が設定されるためエラーにはなりません。
二つ目の dumpName(?string $name)
の宣言の場合、引数に何も渡さなかった場合は引数不足で以下のようなエラーが発生します。
Fatal error: Uncaught ArgumentCountError: Too few arguments to function dumpName()
両者の宣言方法の使い分け
関数としてデフォルト値が無いほうが自然な設計になる場面では ?
を使った宣言をし、
デフォルト値として null が必要な場面では $var = null
といった宣言をすると良いでしょう。