313

今日、いくつかのPHPコードでこれを見ました:

$items = $items ?: $this->_handle->result('next', $this->_result, $this);

?:ここで使用されている演算子に慣れていません。三項演算子のように見えますが、述語が真の場合に評価される式が省略されています。どういう意味ですか?

4

6 に答える 6

634

左のオペランドがtrueの場合は左のオペランドに評価され、それ以外の場合は右のオペランドに評価されます。

擬似コードでは、

foo = bar ?: baz;

おおよそ次のように解決されます

foo = bar ? bar : baz;

また

if (bar) {
    foo = bar;
} else {
    foo = baz;
}

bar一度しか評価されない違いがあります。

foo投稿したコード例に示されているように、これを使用して「セルフチェック」を行うこともできます。

foo = foo ?: bar;

これは null または falsey の場合に割り当てbarられ、そうでない場合は変更されません。foofoofoo

いくつかの例:

<?php
    var_dump(5 ?: 0); // 5
    var_dump(false ?: 0); // 0
    var_dump(null ?: 'foo'); // 'foo'
    var_dump(true ?: 123); // true
    var_dump('rock' ?: 'roll'); // 'rock'
?>

ちなみに、エルヴィス演算子と呼ばれるものです。

エルヴィスのオペレーター

于 2010-01-03T00:24:22.297 に答える
66

ドキュメントを参照してください:

PHP 5.3 以降、三項演算子の中間部分を省略することができます。Expressionは、評価された場合は をexpr1 ?: expr3返し、そうでない場合は返します。expr1expr1TRUEexpr3

于 2010-01-03T00:13:13.240 に答える
4

はい、これは PHP 5.3 の新機能です。TRUE と評価された場合はテスト式の値を返し、FALSE と評価された場合は代替値を返します。

于 2010-01-03T00:13:47.943 に答える