Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
30
Help us understand the problem. What is going on with this article?
@ymm1x

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

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

関数としてデフォルト値が無いほうが自然な設計になる場面では ? を使った宣言をし、
デフォルト値として null が必要な場面では $var = null といった宣言をすると良いでしょう。

30
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ymm1x
明日を今日より生きやすく。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
30
Help us understand the problem. What is going on with this article?