如何在三元运算符中仅评估一次函数?

时间:2014-01-26 15:43:58

标签: php performance memory ternary-operator

我想知道我是否可以创建一个单行三元运算符来检查函数返回的值并使用它?

我们来看看这个例子(PHP)代码:

return get_db_row($sql_parameters) ? get_db_row($sql_parameters) : get_empty_row();

我的目的是返回get_db_row(),但如果它是空的,则返回一个空行。

但是,我认为,此行会调用get_db_row() 两次。是不是?

我想打电话一次。一种解决方案可能是将返回值存储在如下变量中:

$row = get_db_row($sql_parameters);
return $row ? $row : get_empty_row();

但我能在一行中做到这一点吗?

类似的东西:

return ($row = get_db_row()) ? $row : get_empty_row();

有可能吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

你说得对。以下行仅调用该函数一次:

return ($row = get_db_row()) ? $row : get_empty_row();

一些代码证明了这一点:

$counter = 0;
function test() {
    global $counter;
    $counter++;
    return true;
}

$var = ($ret = test()) ? $ret : 'bar';
echo sprintf("#1 called the function %d times\n", $counter);

$counter = 0;
$var = ($ret = test()) ? test() : 'bar';
echo sprintf("#2 called the function %d times", $counter);

输出:

#1 called the function 1 times
#2 called the function 2 times

Demo.

答案 1 :(得分:0)

return get_db_row($sql_parameters) ?: get_empty_row();

如果您运行的是不支持此功能的早期版本的PHP ...

return ($x = get_db_row($sql_parameters)) ? $x : get_empty_row();

应该工作得很好。