48

PHPの?and演算子とは何ですか?:

例えば:

(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)
4

10 に答える 10

83

これは条件演算子です。

$x ? $y : $z

$x「 trueの場合は使用し$y、それ以外の場合は」を意味します$z

短い形式もあります。

$x ?: $z

$x「 trueの場合は使用し$x、それ以外の場合は」を意味します$z

人々はそれ?:が「三項演算子」であるとあなたに言うでしょう。これは間違っています。 ?:は三項演算子です。これは、3つのオペランドがあることを意味します人々は、その名前が「三項演算子」であると考えることになります。これは、特定の言語が持つ唯一の三項演算子であることが多いためです。

于 2009-07-03T17:29:17.647 に答える
33

ターナリについて、ターナリとは何か、使用方法、使用する時期と理由、使用しない場合について少し説明します。

三項演算子とは何ですか?

三元はとの省略? :形です。基本的にはそれだけです。公式の説明の詳細については、このページの途中にある「三項演算子」を参照してください。ifelse

PHP 5.3以降

PHP 5.3以降、三項演算子の中央部分を省略できます。式expr1?:expr3は、expr1がTRUEと評価された場合はexpr1を返し、それ以外の場合はexpr3を返します。

PHP7.0以降

PHP 7には、新しいNull合体演算子があります。これはターナリと同じですが、「issetternary 」とも呼ばれます。これにより、isset()チェックの必要性を排除するチェーンターナリのセットも可能になります。

PHP 5では、存在しない可能性のある変数でternaryを使用する場合は、ternaryステートメントの先頭でisset()を実行する必要があります。

$result = isset($nonExistentVariable) ? $nonExistentVariable : ‘default’;

PHP 7では、代わりにこれを行うことができます。

$result = $nonExistentVariable ?? ‘default’;

ただし、Null合体演算子は空の文字列では機能しません。そのため、この点に注意してください。これの優れている点は、複数の変数の複数のチェックの演算子をチェーンして、チェーン内の各変数が存在するかどうかに応じて一種のバックアップを提供できることです。

$user = $userImpersonatingAnotherUser ?? $loggedInUser ?? “Guest”;

PHPでは、ユーザーがログインできるシステムでは、管理者がテスト目的で別のユーザーになりすますことができるのは珍しいことではありません。上記の例では、ユーザーが別のユーザーになりすましておらず、ログインしているユーザーも存在しない場合、そのユーザーは代わりにゲストユーザーになります。これをまだ理解していない場合は、ターナリとは何か、どのように使用されているかを確認してから、このビットに戻って新しいPHPがどのように使用されるかを確認してください。

三元はどのように使用されますか?

通常のifステートメントは次のようになります。

if (isset($_POST['hello']))
{
    $var = 'exists';
}
else
{
    $var = 'error';
}

それを3つに短縮しましょう。

$var = isset($_POST['hello']) ? 'exists' : 'error';
                 ^            ^     ^    ^     |
                 |           then   |   else   |
                 |                  |          |
          if post isset         $var=this   $var=this

はるかに短いですが、おそらく読みにくいです。$var前の例のように変数を設定するために使用されるだけでなく、これを使用しechoて、変数がfalseであるかどうかを確認することもできます。

$isWinner = false;

// Outputs 'you lose'
echo ($isWinner) ? 'You win!' : 'You lose';

// Same goes for return
return ($isWinner) ? 'You win!' : 'You lose';

なぜ人々はそれらを使用するのですか?

ターナリーはセクシーだと思います。一部の開発者は自慢するのが好きですが、特にPHP 5.4の最新の短いエコーなどの他の機能と組み合わせると、コード内で3項が見栄えがする場合があります。

<?php 
    $array = array(0 => 'orange', 1 => 'multicoloured'); 
?>

<div>
    <?php foreach ($array as $key => $value) { ?>
        <span><?=($value==='multicoloured')?'nonsense':'pointless'?></span>
    <?php } ?>
</div>

<!-- Outputs:
    <span>
        pointless
    </span>
    <span>
        nonsense
    </span> 
-->

少し話題から外れて、「ビュー/テンプレート」にいるとき(MVCパラダイムで懸念を分離している場合)、サーバー側のロジックをできるだけ少なくする必要があります。そのため、ターナリやその他の短縮コードを使用することが最善の方法である場合があります。「その他の短縮コード」とは、次のことを意味します。

if ($isWinner) :
    // Show something cool
endif;

注意してください、私は個人的にこの種の速記が好きではありません/endifナンセンス

三項演算子の速度はどれくらいですか?

人々はマイクロ最適化が好きです。彼らはただそうします。ifしたがって、一部の人にとっては、通常の/elseステートメントと比較した場合に、ターナリのようなものがどれだけ速いかを知ることが重要です。

この投稿を読むと、違いは約0.5msです。それは沢山!

ああ、いや、そうではない。何千もの何千ものものを連続して繰り返し実行している場合、それは多くのことです。あなたはどちらになりません。したがって、速度の最適化についてはまったく心配しないでください。ここではまったく意味がありません。

三元を使用しない場合

コードは次のようになります。

  • 読みやすい
  • わかりやすい
  • 変更が簡単

明らかに、これは、コードを見るときに、そのような概念に関する人の知性とコーディングの知識/一般的なレベルの理解の対象となります。前の例のような単一の単純な三元は大丈夫ですが、次のようなものはあなたがすべきことではありません:

echo ($colour === 'red') ? "Omg we're going to die" :
     ($colour === 'blue' ? "Ah sunshine and daisies" :
     ($colour === 'green' ? "Trees are green"
     : "The bloody colour is orange, isn't it? That was pointless."));

それは3つの理由で無意味でした:

  • 途方もなく長い三元埋め込み
  • switchステートメントを使用できただろう
  • そもそもオレンジ色でした

結論

ターナリーは本当にシンプルで、あまり気にする必要はありません。速度の向上は考慮しないでください。実際には違いはありません。シンプル見栄えの良いときに使用し、将来的に他の人がコードを読み取れるようにしてください。それがターナリを意味しない場合は、ターナリを使用しないでください。

于 2013-07-16T10:47:36.983 に答える
13

三項演算子と呼ばれます。最初の式がtrueと評価された場合は、HTTPS_SERVERが使用され、そうでない場合HTTP_SERVERは選択されます。

これは基本的に省略形ifであり、上記のコードは次のように書き直すこともできます。

if ($request_type == 'SSL') {
   HTTPS_SERVER;
}
else {
   HTTP_SERVER;
}
于 2009-07-03T17:29:45.290 に答える
7

これは、3値条件演算子と呼ばれることもあります。Ternaryは、のように3つの引数があることを意味しx ? y : zます。x基本的に、 trueかどうかをチェックします。yそうである場合は、この操作の代わりに入れてください。そうでない場合はz

$hello = $something ? "Yes, it's true" : "No, it's false";
于 2009-07-03T17:30:53.247 に答える
6

条件演算子? :は、条件をチェックし、条件の値に応じて値を選択するために使用される演算子です。次の形式で表されます。

variable = condition ? expression1 : expression2;

それは次のように機能します...

  1. まず、状態を評価します。
  2. 条件が真の場合、expression1評価されます。そして、expression1の値が変数に割り当てられます。
  3. 条件がfalseの場合、 expression2が評価されます。そして、expression2の値が変数に割り当てられます。

例えば:

x = (a>b) ? 5 : 9

ここで、xについては、最初に条件(a> b)が評価されます。この条件が真になると、xは値5になります(つまり、x = 5)。ただし、条件(a> b)がfalseになると、xは値9になります(つまり、x = 9)。

三項演算子

条件演算子? :は、三項演算子と呼ばれることもあります。これは、3つのオペランドが含まれるためです。例えば:

x ? y : z

ここで、x、y、zは3つのオペランドです。条件xが真の場合、値yが割り当てられ、そうでない場合は値zが割り当てられます。

于 2009-08-23T22:52:08.583 に答える
3

これは文章を書く簡単な方法ですif。また、Java、JavaScriptなどの他の言語でも使用されます。

あなたのコード、

$protocol = $request_type == 'SSL' ? HTTPS_SERVER : HTTP_SERVER;

このように書くことができます:

if ($request_type == 'SSL')
    $protocol = HTTPS_SERVER;
else
    $protocol = HTTP_SERVER;
于 2009-07-03T17:50:21.083 に答える
0

これは1行のifステートメントです。

condition ? true : false

あなたの場合、通常のifステートメントに変換すると、次のようになります。

if($request_type == 'SSL') HTTPS_SERVER;
else HTTP_SERVER;
于 2009-07-03T17:30:47.117 に答える
0

ifこれは基本的に、 -elseステートメントを書くための素晴らしい方法です。読みやすいと言う人もいれば、そうでない人もいます。

ウィキペディアの三項演算子

于 2009-07-03T17:31:48.473 に答える
0

これはifステートメントのように機能し、慣れれば非常にシンプルで簡単です。(conditions_expressions)?what_to_do_if_true:what_to_do_if_false。

于 2020-04-27T22:44:26.180 に答える
-1

John Tが言うように、これは三項演算子と呼ばれ、本質的にはif/elseステートメントの省略形です。あなたの例は、完全なif / elseステートメントとして、次のようになります。

if($request_type == 'SSL')
{
    HTTPS_SERVER;
}
else
{
    HTTP_SERVER;
}
于 2009-07-03T17:32:32.373 に答える