PHP
PHP7

【PHP】引数の二種類の NULL 許容型の宣言方法とその違い

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 から使えます

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()

両者の宣言方法の使い分け

シンタックスとしては ? を使った宣言の方がスマートだと思いますが、挙動としては大した違いは無いのでデフォルト値の必要性の有無で使い分けるといいのではないでしょうか。