私はこれをいくつかのPHPコードで今日見ました:
$items = $items ?: $this->_handle->result('next', $this->_result, $this);
?:
ここで使用されている演算子についてはよく知りません。三項演算子のように見えますが、述語が真であるかどうかを評価する式は省略されています。どういう意味ですか?
私はこれをいくつかのPHPコードで今日見ました:
$items = $items ?: $this->_handle->result('next', $this->_result, $this);
?:
ここで使用されている演算子についてはよく知りません。三項演算子のように見えますが、述語が真であるかどうかを評価する式は省略されています。どういう意味ですか?
回答:
左のオペランドがtrueyの場合は左のオペランドに評価され、そうでない場合は右のオペランドに評価されます。
擬似コードでは、
foo = bar ?: baz;
大まかに解決する
foo = bar ? bar : baz;
または
if (bar) {
foo = bar;
} else {
foo = baz;
}
違いbar
は1回だけ評価されます。
これを使用して、foo
投稿したコード例に示されているように「セルフチェック」を行うこともできます。
foo = foo ?: bar;
これはif がnullまたはfalseに割り当てbar
られ、それ以外の場合は変更されません。foo
foo
foo
さらにいくつかの例:
<?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'
?>
ちなみに、エルビス演算子と呼ばれています。
||
。それでblah || 'default'
?
||
演算子は常にブール値を返します。
ドキュメントを参照してください:
PHP 5.3以降、三項演算子の中間部分を省略することが可能です。式
expr1 ?: expr3
はexpr1
、にexpr1
評価された場合にTRUE
、expr3
そうでない場合に戻ります。
expr2
と、それが消えただけで、評価されていません。$this->expensiveComputation() ?: "nope"
と同じではありません$this->expensiveComputation() ? $this->expensiveComputation() : "nope"
-expr1は一度だけ評価されます。
配列には注意してください。次の?
理由により、チェック変数をの後に記述する必要があります。
$params = ['param1' => 'value1',
'param2' => 'value2',
'param3' => 'value3',];
$param1 = isset($params['param1'])?:null;
$param2 = !empty($params['param2'])?:null;
$param3 = $params['param3']?:null; // get E_NOTICE, if $params['param3'] eq false
var_dump($param1,$param2,$param3);
true // would like to expect `value1`
true // would like to expect `value2`
param3 // properly, but problem above
更新しました
RFCから。将来(PHP 7では)演算子Null Coalesce Operatorがそれを実行します。次に例を示します。
$param1 = $params['param1'] ?? null;
// Equivalent to: $param1 = isset($params['param1']) ? $params['param1'] : null;
もう1つの重要な考慮事項:ElvisオペレーターはZend Opcacheトークン化プロセスを中断します。私はこれを難しい方法で見つけました!これは後のバージョンで修正されている可能性がありますが、この問題がPHP 5.5.38(組み込みのZend Opcache v7.0.6-dev)に存在することを確認できます。
ファイルの一部がZend Opcacheにキャッシュされるのを「拒否」する場合は、これが理由の1つである可能性があります。これが役立つことを願っています!
はい、これはPHP 5.3の新機能です。TRUEと評価された場合はテスト式の値を返し、FALSEと評価された場合は代替値を返します。
TRUE
です。
null
それが何かの値を持つことを前提とするだけではありません。Just sayin '