ホームページ  >  記事  >  バックエンド開発  >  PHPの条件演算子で発生した問題とその解決策について

PHPの条件演算子で発生した問題とその解決策について

不言
不言オリジナル
2018-07-14 13:54:211533ブラウズ

この記事では、主に 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;

と等価であり、一度実行すると真となるため、演算子の優先順位が問題を引き起こす可能性は排除できます。

しかし、公式ドキュメントでは、

演算子の組み合わせ方向の例に次のような文があります

:

これは、上記の現象と非常によく似ていますが、問題はここにあるはずです。いろいろ調べた結果、次のような結論に至りました。

PHPの条件演算子で発生した問題とその解決策について結論

    C言語における条件演算子(?:)の結合方向は
  • 右から→ left

    、各評価は右端の部分式から開始されるため、

    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
    PHP の条件演算子 (?:) の組み合わせ。方向は左から
  • に移動し、各評価は左端の部分式から開始されるため、

    $x = 1;
    $shit = $x == 1 ? 100 : 
       $x == 2 ? 200 : 300;
    //等效于
    $shit = ($x == 1 ? 100 : 
       $x == 2) ? 200 : 300;
    //等效于
    $shit = (100) ? 200 : 300;// 200
はPHP条件演算子の組み合わせ方向の間にあり、if-elseif-の効果を達成できません。 C/C

のようなネストされた条件演算子による 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。