web-dev-qa-db-ja.com

PHP演算子 "?"と ":"は何と呼ばれ、それらは何をしますか?

PHPの?および:演算子とは何ですか?

例えば:

(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)
44
seb

これは条件演算子です。

$x ? $y : $z

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

短い形式もあります。

$x ?: $z

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

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

76
chaos

ターナリについて、それらが何であるか、それらをどのように使用するか、それらをいつ、なぜ使用するか、そしていつ使用しないかについて少し書きます。

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

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

PHP 5.3現在:

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

現在PHP 7.0

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

PHP 5では、存在しない可能性のある変数で3項を使用する場合は、3項ステートメントの先頭で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';
}

それを三元に短縮しましょう。

$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の最新 短いエコー

<?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;

注、私は個人的にこの種の速記が好きではありませんif/endif nonsense

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

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

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

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

三元を使用しない場合

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

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

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

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ステートメントを使用できたはずです
  • そもそもオレンジでした

結論

ターナリーは本当にシンプルで、あまり気にする必要はありません。 anyの速度の向上を考慮しないでください。実際には違いはありません。 simpleおよびlook niceの場合に使用し、常に確認してくださいあなたのコードは将来他の人が読めるようになるでしょう。それが三元を意味しない場合は、三元を使用しないでください。

30
Jimbo

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

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

if ($request_type == 'SSL') {
   HTTPS_SERVER;
}
else {
   HTTP_SERVER;
}
12
John T

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

$hello = $something ? "Yes, it's true" : "No, it's false";
6
Deniz Dogan

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

variable = condition ? expression1 : expression2;

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

  1. まず、条件が評価されます。
  2. 条件が真の場合、式1が評価されます。そして、expression1の値がvariableに割り当てられます。
  3. conditionが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が割り当てられます。

5
Hage Taka

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

あなたのコード、

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

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

if ($request_type == 'SSL')
    $protocol = HTTPS_SERVER;
else
    $protocol = HTTP_SERVER;
2
xpepermint

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

condition ? true : false

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

if($request_type == 'SSL') HTTPS_SERVER;
else HTTP_SERVER;
0

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

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

0