有条件地分配PHP值

时间:2010-12-01 22:14:44

标签: php ternary-operator

对于基于表达式结果为变量赋值的常见情况,我是三元运算符的粉丝:

$foo = $bar ? $a : b;

但是,如果$ bar是一个相对昂贵的操作,并且我想将$ bar的结果分配给$ foo,如果结果是真的,那么效率很低:

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

一个选项是:

$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 个答案:

答案 0 :(得分:38)

PHP 5.3引入了一种新语法来解决这个问题:

$x = expensive() ?: $default;

请参阅documentation

  

从PHP 5.3开始,可以省略三元运算符的中间部分。
如果expr1 ?: expr3评估为expr1,则表达式expr1会返回TRUE,否则会返回expr3

答案 1 :(得分:8)

你能更新SomeClass:bigQuery()来返回一个新的EmptySet()而不是false吗?

然后你就有了

$foo = SomeClass::bigQuery();

答案 2 :(得分:1)

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

修订版2,信用@meagar

答案 3 :(得分:1)

您最后一个选项稍有不同:

$ foo = SomeClass :: bigQuery()或者新的EmptySet(); 这实际上不起作用,感谢您的注意。

经常与mySQL代码结合使用,但在类似情况下似乎总是被遗忘:

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

虽然我个人更喜欢你已提到过的一个:

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