23

式の結果に基づいて変数に値を代入する非常に一般的なケースでは、私は三項演算子のファンです。

$foo = $bar ? $a : b;

ただし、$bar が比較的高価な操作であり、結果が真である場合に $bar の結果を $foo に割り当てたい場合、これは非効率的です。

$foo = SomeClass::bigQuery() ? SomeClass::bigQuery() : new EmptySet();

1 つのオプションは次のとおりです。

$foo = ($result = SomeClass::bigQuery()) ? $result : new EmptySet();

$resultしかし、余分なものを記憶に残したくありません。

私が持っている最良のオプションは次のとおりです。

$foo = ($foo = SomeClass::bigQuery()) ? $foo : new EmptySet();

または、三項演算子なし:

if(!$foo = SomeClass::bigQuery()) $foo = new EmptySet();

または、プログラム フロー演算子が好みでない場合は、次のようにします。

($foo = SomeClass::bigQuery()) || ($foo = new EmptySet());

非常に多くのオプションがありますが、どれも満足のいくものではありません。どちらを使用しますか?ここで本当に明白な何かが欠けていますか?

4

4 に答える 4

40

PHP 5.3 では、まさにこの問題を解決する新しい構文が導入されました。

$x = expensive() ?: $default;

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

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

于 2010-12-01T22:18:41.203 に答える
8

SomeClass:bigQuery() を更新して、false ではなく新しい EmptySet() を返すことはできますか?

次に、あなたはただ持っています

$foo = SomeClass::bigQuery();
于 2010-12-01T22:19:05.863 に答える
1
$foo = SomeClass::bigQuery();
if (!$foo) $foo = new EmptySet();

リビジョン 2、クレジット @meagar

于 2010-12-01T22:20:07.907 に答える
1

最後のオプションのわずかなバリエーション:

$foo = SomeClass::bigQuery() または new EmptySet(); これは実際には機能しません。ご指摘ありがとうございます。

多くの場合、mySQL コードと組み合わせて使用​​されますが、同等の状況では常に忘れられているようです。

$result = mysql_query($sql) or die(mysql_error());

個人的には、あなたがすでに言及したものを好みますが:

if(!$foo = SomeClass::bigQuery())
    $foo = new EmptySet();
于 2010-12-01T23:38:08.680 に答える