PHP の短い三項演算子 ("Elvis") と null 合体演算子の比較 質問する

PHP の短い三項演算子 (

誰か違いを説明してくれませんか?三項演算子の省略形?:) そしてヌル合体演算子??PHP で( ) を使用するには?

彼らはいつ違った行動をとり、いつ同じように行動するのでしょうか (もしそんなことが起こるとしても)?

$a ?: $b

VS.

$a ?? $b

ベストアンサー1

  • Elvisは?:最初の引数に「真っぽい」値が含まれている場合(true最初の行でどの値が大まかに等しいとみなされるかを確認してください)を返します。== による緩い比較表)。または、そうでない場合は2番目の引数

      $result = $var ?: 'default';
      // is a shorthand for 
      $result = $var ? $var : 'default';
    
  • Null結合は、??最初の引数が設定されていない場合はそれを返しますnull。そうでない場合は2番目の引数を返します。

      $result = $var ?? 'default';
      // is a shorthand for 
      $result = isset($var) ? $var : 'default';
    

E_NOTICE最初の引数がnullの場合、null結合は未定義の変数がある場合に出力されない点を除いて基本的に同じです。PHP 7.0 移行ドキュメントこう言っています。

ヌル合体演算子 (??) は、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

もちろん、これは常に最初の引数が であるnullと仮定しています。それがnullでなくなると、演算子??は常に最初の引数を返しますが、?:省略形は最初の引数が真の場合のみ返します。これは、PHPはブール値に型キャストする

それで:

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

$aは に等しくfalse$bに等しくなります'g'

おすすめ記事