有条件地分配PHP值

Ham*_*ish 22 php ternary-operator

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

$foo = $bar ? $a : b;
Run Code Online (Sandbox Code Playgroud)

但是,如果$ bar是一个相对昂贵的操作,并且如果结果是真的,我想将$ bar的结果赋给$ foo,这是低效的:

$foo = SomeClass::bigQuery() ? SomeClass::bigQuery() : new EmptySet();
Run Code Online (Sandbox Code Playgroud)

一种选择是:

$foo = ($result = SomeClass::bigQuery()) ? $result : new EmptySet();
Run Code Online (Sandbox Code Playgroud)

但我宁愿没有额外$result的记忆.

我得到的最好选择是:

$foo = ($foo = SomeClass::bigQuery()) ? $foo : new EmptySet();
Run Code Online (Sandbox Code Playgroud)

或者,没有三元运算符:

if(!$foo = SomeClass::bigQuery()) $foo = new EmptySet();
Run Code Online (Sandbox Code Playgroud)

或者,如果程序流操作符不是您的风格:

($foo = SomeClass::bigQuery()) || ($foo = new EmptySet());
Run Code Online (Sandbox Code Playgroud)

这么多选择,非他们真的令人满意.你会使用哪种,我错过了一些非常明显的东西?

mea*_*gar 39

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

$x = expensive() ?: $default;
Run Code Online (Sandbox Code Playgroud)

查看文档:

从PHP 5.3开始,可以省略三元运算符的中间部分.如果求值,则返回
表达式,否则expr1 ?: expr3返回.expr1expr1TRUEexpr3


Jef*_*vis 8

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

那你就是

$foo = SomeClass::bigQuery();
Run Code Online (Sandbox Code Playgroud)