web-dev-qa-db-ja.com

三項演算子と文字列連結の癖?

こんにちは私はこのコードがなぜ(少なくとも私にとって)不正確な結果をもたらすのか知りたいだけです。

まあ、おそらく私はここで間違っています

$description = 'Paper: ' . ($paperType == 'bond') ? 'Bond' : 'Other';

PaperTypeが「Bond」と等しい場合、説明は「Paper:Bond」であり、paperTypeが「Bond」と等しくない場合、説明は「Paper:Other」であると推測していました。

しかし、このコードを実行すると、結果は「Bond」または「Other」のいずれかであり、文字列「Paper:」はどこに行きましたか?

49
Cesar
$description = 'Paper: ' . ($paperType == 'bond' ? 'Bond' : 'Other');

文字列が正しい順序で文字列に連結されるように、括弧を追加してみてください。

92
meder omuraliev

演算子の優先順位に関連しています。次のことを行う必要があります。

$description = 'Paper: ' . (($paperType == 'bond') ? 'Bond' : 'Other');
11
João Silva

みんなが解決策をくれたと思うので、思いがけない結果の理由を投稿したい。

まず、ここで、原点と、演算子の評価方法(左、右、結合など)を確認できます。

http://php.net/manual/fa/language.operators.precedence.php

さて、あなたの文章を分析したら。

$ paperType = 'bond';
$ description = 'Paper:'. ($ paperType == 'bond')? 'Bond': 'Other';

1)テーブルを確認すると、括弧が最初に評価され、次に「。」が評価されます。 (連結)が評価され、最後に三項演算子 '?'が評価されるため、次のように関連付けることができます。

// evaluate the parenthesis ... ($ paperType == 'bond')
$ description = ('Paper:'. 1)? 'Bond': 'Other';
//result
$ description = 'Paper: 1'? 'Bond': 'Other';

2)これで三項演算子ができました。文字列が「true」と評価されることがわかります

// phpのドキュメントブール値に変換する場合、次の値はFALSEと見なされます:

...空の文字列と文字列 "0"

$ description = true? 'Bond': 'Other';

3)最後に

$ description = 'bond';

質問が明確になったといいのですが。ご挨拶。

2
Hizmarck