有条件地分配 PHP 值

2022-08-30 18:17:20

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

$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());

这么多的选择,没有一个真正令人满意。你会使用哪个,我在这里错过了一些非常明显的东西吗?


答案 1

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

$x = expensive() ?: $default;

请参阅文档

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


答案 2

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

那么你只是有

$foo = SomeClass::bigQuery();

推荐