1. ホーム
  2. php

[解決済み] PHPの三項演算子とNULL合体演算子の比較

2022-03-20 19:39:28

質問

との違いを説明してください。 三項演算子の省略記法 ( ?: ) と NULL合体演算子 ( ?? )をPHPで使用することはできますか?

どのような場合に異なる動作をし、どのような場合に同じ動作をするのでしょうか(もし、そのようなことがあれば)。

$a ?: $b

VSです。

$a ?? $b

解決方法は?

第一引数がNULLの場合、NULL合体では E_NOTICE 未定義の変数があるとき。そのため PHP 7.0移行ドキュメント はこのように言っています。

null合体演算子(??)は、構文上の糖分として追加されました。 と組み合わせて三項演算子を使用する必要がある場合のために isset() を使用します。これは、最初のオペランドが存在し、かつ NULL でない場合に返します。 それ以外の場合は、2 番目のオペランドを返します。

以下は、これを示すサンプルコードです。

<?php

$a = null;

print $a ?? 'b'; // b
print "\n";

print $a ?: 'b'; // b
print "\n";

print $c ?? 'a'; // a
print "\n";

print $c ?: 'a'; // Notice: Undefined variable: c in /in/apAIb on line 14
print "\n";

$b = array('a' => null);

print $b['a'] ?? 'd'; // d
print "\n";

print $b['a'] ?: 'd'; // d
print "\n";

print $b['c'] ?? 'e'; // e
print "\n";

print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33
print "\n";

このメッセージが表示された行は、NULL合算演算子ではなく、省略形の三項演算子を使用している行です。しかし、この通知があったとしても、PHP は同じ応答を返します。

コードを実行します。 https://3v4l.org/McavC

もちろん、これは常に第1引数が null . NULLでなくなってしまうと、「NULL」であるか「NULLでない」かの違いになってしまいます。 ?? 演算子は常に最初の引数を返すのに対し ?: は最初の引数が真である場合だけであり、これは PHP はブーリアン型に変換します。 .

だから

$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'

は、次のようになります。 $a となる false$b に等しい。 'g' .