2026.01.24
#php#programing
blog

phpのnull合体演算子を深掘りする

不思議に思ったこと

以下のコードが実行された時、$user->nameで例外となり2行目でエラーが発生すると思っていた。

$user = null;
$name = $user->name ?? null;

しかし、実際には例外は発生せず、$name = nullの状態で次の処理に進む。

!HELP 疑問 $user->name ?? null;のような「null合体演算子」では、 なぜ$user->nameで例外をthrowしないのか...?

調べてみた

(expr1) ?? (expr2) は、 expr1null である場合は expr2 と評価され、それ以外の場合は expr1 と評価されます。 この演算子は、左側の値が存在しない場合でも noticewarning が発生しません。 isset() と同じ挙動です。 これは、配列のキーを扱う場合に便利です。

※ 参考: 比較演算子 - php公式

「左側の値(式1)が null かどうか」を評価して結果を返すので、 $user = null である → $user->name = null である という評価をしているようです。

注意したい点

  1. 厳密に null を評価する

式1が null ではなく false'' だった場合、式1を結果として返す

$val = '';
$result = $val ?? 'NULL';   // 結果: ''
  1. 使えるのは PHP 7.0 以降

バージョン問題ばかりは苦しいですネ...