この記事では、主に PHP の条件演算子に関して遭遇した問題と解決策を紹介します。特定の参考値があります。今、共有します。困っている友達は参考にしてください。
今日遭遇しましたPHPPhenomena
) のネストされた使用に関する質問です。まず、C 言語コード (test.c#) を見てみましょう。 # #):
#include<stdio.h> int main() { int x = 1; int shit = x == 1 ? 100 : x == 2 ? 200 : 300; printf("shit的值:%d\n", shit); return 0; }</stdio.h>コンパイルして実行してください
root$ gcc test.c -o test && ./test shit的值:100答えは予想通りです。x==1 なので 100 が割り当てられます。 しかし、上記のコードを PHP で書き直すと (
test.php):
<?php $x = 1; $shit = $x == 1 ? 100 : $x == 2 ? 200 : 300; echo "shit的值:$shit\n";実行してください:
root$ php test.php shit的值:200が返されることがわかります。結果が異なりますが、これはなぜですか? トラブルシューティングまず、
比較演算子(==)と条件演算子(? :) PHP では、PHP 公式ドキュメントを確認してみましょう
は ?: ( C言語の場合も同様)なので、 $shit = $x == 1 ? 100 :
$x == 2 ? 200 : 300;
は
$shit = ($x == 1) ? 100 : ($x == 2) ? 200 : 300;
と等価であり、一度実行すると真となるため、演算子の優先順位が問題を引き起こす可能性は排除できます。
しかし、公式ドキュメントでは、
演算子の組み合わせ方向の例に次のような文があります:
これは、上記の現象と非常によく似ていますが、問題はここにあるはずです。いろいろ調べた結果、次のような結論に至りました。結論
、各評価は右端の部分式から開始されるため、
int x = 1; int shit = x == 1 ? 100 : x == 2 ? 200 : 300; //等效于 int shit = x == 1 ? 100 : (x == 2 ? 200 : 300); //等效于 int shit = x == 1 ? 100 : (300);// 100
に移動し、各評価は左端の部分式から開始されるため、
$x = 1; $shit = $x == 1 ? 100 : $x == 2 ? 200 : 300; //等效于 $shit = ($x == 1 ? 100 : $x == 2) ? 200 : 300; //等效于 $shit = (100) ? 200 : 300;// 200
のようなネストされた条件演算子による elseif-else 式。後の部分式に括弧を追加しない限り、この例では次の方法で解決できます: $shit = $x == 1 ? 100 :
($x == 2 ? 200 : 300);
ただし、数が多い場合は、条件分岐を実行すると、コードの可読性の問題 (括弧の積み重ね) が発生します:
$shit = $x == 1 ? 100 : ($x == 2 ? 200 : ($x== 3 ? 300 : ... ($x == 8 ? 800 : 900)))))));
PHP の括弧を積み重ねない記述方法は、実行結果の点で C/C と矛盾しており、デフォルトの結合方向は変更することしかできません。括弧を追加することで期待される結果が得られるため、PHP ドキュメントでは単にネストされた条件演算子の使用を推奨していません:
注:
三項式の「積み重ね」を避けることをお勧めします。PHP の単一のステートメント内で複数の三項演算子を使用する場合の動作は明白ではありません
上記は、この記事の全内容が皆様の学習に役立つことを願っています。その他の関連コンテンツについては、次のリンクに注意してください。 PHP中国語ウェブサイトです!
関連する推奨事項:
フレームワーク開発における依存関係注入、コンテナー、および外観パターンについて話しましょう (パート 2)解決方法PHP の問題 同時実行性と大量のトラフィックの問題以上がPHPの条件演算子で発生した問題とその解決策についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。