はじめに

PHP, Laravel で null の可能性があるケースでの便利なメソッドや演算子について調べたので忘れないようにメモ。

※Ruby の Safe Navigation Operator (ぼっち演算子) hoge&.name とかのようなもの。

TL;DR

  • optional(): optional($hoge)->name とすると、$hoge = null の時は null が返ってくる
    • エラーにならない
  • Null 合体演算子 ??: $a = $b ?? 'null だよ' とすると、$b != null の時は $b$b == null の時は ?? の後の値が設定される
    • 三項演算子($a = $b != null ? $b : ‘null だよ’`)のようなもの
  • optional($a)->name ?? '未入力' のように組み合せて使うと便利

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. optional
    2. Null 合体演算子 ??
    3. 組み合わせる
  5. まとめ
  6. その他・メモ
  7. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"

$ php -v
PHP 7.2.22-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Sep 2 2019 12:54:12) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

$ composer info laravel/framework
name : laravel/framework
versions : * v5.7.28

詳細

optionalNull 合体演算子 ?? を使う。

optional

Laravel 5.5 以降で利用可能。

php artisan tinker で検証。

まずは $user = null のときの動作。

1
2
3
4
5
6
7
8
9
10
11
12
$ art t
Psy Shell v0.9.9 (PHP 7.2.22-1+ubuntu16.04.1+deb.sury.org+1 — cli) by Justin Hileman
>>> $user = null
=> null

// null なので当然エラーになる
>>> $user->name
PHP Notice: Trying to get property 'name' of non-object in Psy Shell code on line 1

// optional を使うとエラーにならず null が返ってくる
>>> optional($user)->name
=> null

$user に中身が設定されている時の動作。

1
2
3
4
5
6
7
8
9
10
11
12
>>> $user = App\User::find(1)
=> App\User {#3072
id: 1,
name: "hoge",
}

>>> $user->name
=> "hoge"

// optional を使っても、中身が null でなければ値が返ってくる
>>> optional($user)->name
=> "hoge"

Null 合体演算子 ??

次は ?? 演算子。正式名称は Null 合体演算子、PHP7 以降で利用可能。

普通に三項演算子を使うとこうなる。

1
2
3
4
5
6
>>> $a = null
=> null

// 三項演算子
>>> $b = $a != null ? $a : 'string'
=> "string"

?? 演算子を使うとこう書ける。

1
2
>>> $b = $a ?? 'string'
=> "string"

組み合わせる

組み合せて使うと、null のガードをしつつデフォルト値設定のようなことがシンプルに書ける。

1
2
3
4
5
>>> $a = null
=> null

>>> optional($a)->name ?? '未入力'
=> "未入力"

まとめ

  • optional(): optional($hoge)->name とすると、$hoge = null の時は null が返ってくる
    • エラーにならない
  • Null 合体演算子 ??: $a = $b ?? 'null だよ' とすると、$b != null の時は $b$b == null の時は ?? の後の値が設定される
    • 三項演算子($a = $b != null ? $b : ‘null だよ’`)のようなもの
  • optional($a)->name ?? '未入力' のように組み合せて使うと便利

その他・メモ

LaravelでもOptional Chainを使いたい、使おう。 - Qiita の内容を導入すると、より便利になりそう(だけど試してない)。

参考文献

関連記事