web-dev-qa-db-ja.com

二重疑問符(??)演算子の意味 PHP

私はSymfonyのframwork(version 4)のコードに飛び込みましたが、このコードの平和を見つけました:

$env = $_SERVER['APP_ENV'] ?? 'dev';

これが実際に何をするのかはよくわかりませんが、次のように展開されると思います。

$env = $_SERVER['APP_ENV'] != null ? $_SERVER['APP_ENV'] : 'dev';

または多分:

$env = isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : 'dev';

誰かが主題について何か正確さを持っていますか?

編集:

質問に回答したすべての人々に:ありがとうございます私の質問に否定的なマークを付けたすべての人々に/似たような質問があるので( PHP三項演算子vs null合体演算子 ):

どちらの質問も非常によく似ています。しかし誰もが "??"と想像するのは難しいです。合体演算子と呼ばれます。

それ以外の場合は、公式文書で簡単に見つけることができます。

http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

しかし、この機能がphp 7で追加されたことを知らない人のためには、もっとタイプするのが普通です:

"php ??演算子"または "php二重疑問符演算子"

そして、これが私の質問に付加価値がある理由です。

私はあなたにお願いします、お願いします、あなたの否定的なフィードバックを再考してください。ありがとう

よろしく、エピシログ

52
epixilog

これはphp 7.0で追加された "null合体演算子"です。仕組みの定義は次のとおりです。

最初のオペランドが存在し、それがNULLでない場合は、その最初のオペランドを返します。それ以外の場合は2番目のオペランドを返します。

つまり、便利な演算子では実際にはisset()だけです。

これら2つは同等です:

$foo = $bar ?? 'something';
$foo = isset($bar) ? $bar : 'something';

ドキュメンテーション: http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.coalesce

新しいPHP7の機能のリストで: http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

そして元のRFC https://wiki.php.net/rfc/isset_ternary

58
michalhosna
$myVar = $someVar ?? 42;

と同等です:

$myVar = isset($someVar) ? $someVar : 42;
8
Cid
$x = $y ?? 'dev'

yが設定されている場合はx = yの短縮形、そうでない場合はx = 'dev'

もあります

$x = $y =="SOMETHING" ? 10 : 20

yが 'SOMETHING'に等しい場合はx = 10、そうでない場合はx = 20

1
Prodigle