71
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-03-12

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 といった宣言をすると良いでしょう。

71
51
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?