PHP

PHP7以降のnullableな引数の型宣言がしたい場合の書き方

こんにちは、最近PHP7系を使った開発をしてますせいや(@knkSeiya)です。

この記事はPHP5とPHP7の違いをまとめていきたいシリーズの一つです。今回は引数型のお話

PHP5系とPHP7以降の大きな違いの一つに型宣言があります。

PHP7以降では関数・メソッドの引数に以下のような型が指定できるようになったんです!

  • string・・・文字列
  • int・・・整数
  • float・・・浮動小数点数
  • bool・・・boolean
// 引数の型がstring以外の時はエラーとなる
insert_message(string $message)
{
    // 以下$messageを処理
}

これなら引数に予期しない値が入ってくるバグを未然に防げるし、コードを読むときもその関数がどういう引数を使うのかイメージしやすいですね〜。

んで、せっかくPHP7を使うなら引数に型が付けたい!って思って、フロントからの入力をDBに保存するメソッドで型指定をしたんですが一つ罠があって、

引数の型を指定したらnullが通らなくなったんです・・・!

insert_message(string $message)
{
    // 以下$messageを処理
}

// Fatal error: Uncaught TypeError: Argument 1 passed to insert_message() must be of the type string, null given
// のエラーが発生する
insert_message(null); 

ここでnullを許容したい場合は別途nullを許容する書き方が必要らしい。こういうのnullableな型って言うらしいです。

以下、PHP7.0とPHP7.1以降のnullを許容する引数の書き方を紹介します。

PHP7.0のnullableな引数

PHP7.0では引数や戻り値に型をつけることはできますが、nullableな型を使うことができません。

PHP7.0で引数に型を指定しつつnullを許容したい場合はデフォルト値にnullを指定します。

// 型を指定しつつデフォルト値にnullを設定する
insert_message(string $message = null)
{
    if ($message === null) return;  // messageがnullだったら処理しない(ガード節)
    // 以下$messageを処理
}

formからの入力をDBに登録するときとか、そのときのページ状態によってnullをリクエストするInput要素とかあると、結構value or nullのデータを投げたいときってあるんですよね。そんな時に使えそうです。

PHP7.1からnullableな型がサポートされた

PHP7.1からはnullableな型がサポートされました。

PHP7.0のようにちょっと捻った書き方をしなくても良くなったので書きやすいです。

insert_message(?string $message)
{
    if ($message === null) return;  // messageがnullだったら処理しない(ガード節)
    // 以下$messageを処理
}

PHPは型に関して雰囲気でなんとかなってる感ありますが、やっぱり型が指定できると安心しますね。

せっかくPHP7系を使うなら、引数・戻り値の型はしっかり管理しておきたいです。