新しいPHP7のヌル合体演算子を三項演算子で使用すると予期しない動作に直面しています。PHPのヌル合体+三項演算子の不思議な振る舞い
コンクリート状況(擬似コード):
function a()
{
$a = 1;
$b = 2;
return $b ?? (false)?$a:$b;
}
var_dump(a());
結果がint(1)です。
誰でも私の理由を説明できますか?
新しいPHP7のヌル合体演算子を三項演算子で使用すると予期しない動作に直面しています。PHPのヌル合体+三項演算子の不思議な振る舞い
コンクリート状況(擬似コード):
function a()
{
$a = 1;
$b = 2;
return $b ?? (false)?$a:$b;
}
var_dump(a());
結果がint(1)です。
誰でも私の理由を説明できますか?
あなたのスペースは、phpが式を評価する方法を反映していません。 ??
は、3進表現よりもhigher precedenceであることに注意してください。限り$b
がnull
ではありませんかfalse
に評価される$a
です
($b ?? false) ? $a : $b;
:
あなたは結果を取得します。
私は参照してください、 – Aldos
return $b ?? (false)?$a:$b;
この最初の文を調べは、$b ?? (false)
その結果、その後? $a:$b
に渡され評価されます。ある$a
の値を返す
リターン($b) ? $a : $b
:
$b ?? (false)
手段は、発現の上方に、真っぽい値であり、この場合に$b = 2
ので$b
である第一not null and isset
値は、となる与えますint(1)
オリジナルのリターンステートメントを次のように考えると、この全体がよりよく理解できます。
リターン我々は??
は自分の正気と将来コーダーの便宜上?
良い詳細な説明、ありがとう – Aldos
前に評価されているので、私は常に明示的にこのような式でブラケットを使用し、私のコードを使用して、追加のブラケットを追加する必要がいけない
($b ?? (false)) ? $a : $b;
。私は自分の意図を述べ、優先順位やその他の副作用に頼らないことを好む。 –
それは良い点であり、私の悪いです、あなたに感謝 – Aldos