如何在php中缩短分配新值或默认值的逻辑

如何在php中缩短分配新值或默认值的逻辑,php,Php,我有以下php代码: $mode = $this->input->get('mode'); // may return string or boolean false if(!$mode) $mode = 'default'; 如何以最快的执行速度将此代码缩短为一行 这是完美的一个: $mode = ($mode=$this->input->get('mode'))?$mode:'default'; 更具可读性的方式 if(!($mode = $this-&g

我有以下php代码:

$mode = $this->input->get('mode'); // may return string or boolean false
if(!$mode)
    $mode = 'default';
如何以最快的执行速度将此代码缩短为一行

这是完美的一个:

$mode = ($mode=$this->input->get('mode'))?$mode:'default';
更具可读性的方式

if(!($mode = $this->input->get('mode')))
$mode = 'default';
$mode = ($mode = $this->input->get('mode'))?$mode:'default';
还有一种可读性较差的方式

if(!($mode = $this->input->get('mode')))
$mode = 'default';
$mode = ($mode = $this->input->get('mode'))?$mode:'default';

我不认为你能通过这种过早的优化赢得任何东西,除了一行源代码:

if(!($mode = $this->input->get('mode'))) {
    $mode = 'default';
}
如果任何falsy值(例如,
null
、空字符串、
0
)应设置为
“默认值”
,则这将执行以下操作:

$mode = ($this->input->get('mode') || 'default');
抱歉,这只返回布尔值。

编辑:

如果$this->input->get()的运算速度大于O(n),请不要使用此选项

$mode = $this->input->get('mode') or $mode = "default";
($mode = $this->input->get('mode')) or ($mode = "default");
但是为什么要为这么小的东西而烦恼呢

请注意,计算上述表达式的实际结果为
true
,但该表达式未指定任何内容。如果我们要做
$something=($mode=$this->input->get('mode')或$mode=“default”)
我们将在
$something
中得到
true
。为了更清楚,我上面写的内容是这样评估的:

由于您可能在
get
方法中进行了一些清理,因此您可以使用
,而不是使用该方法来检查是否设置了变量!在
$\u GET
上清空
,这是您唯一检查设置是否存在安全问题的方法,因此这将检查字符串是否已实际设置,以及是否为空

如果此结果为true,则它将从
get
方法中获取经过消毒的版本,并将其分配给
$mode
,否则将
默认值
分配给
$mode


希望这能有所帮助。

不完全是一行,但无论如何

if ( false === $mode = $this->input->get('mode') )
{
    $mode = 'default';    
}

你确定那很慢吗?我会投票让你的代码保持简单,直到它被证明可读性的损失值得一些可测量的性能变化。如果$this->input->get('mode')返回一个空字符串怎么办?应该将其视为false(正如您的代码现在所做的那样)还是指定的字符串?这只会在任何情况下返回布尔结果。您是对的,我最近没有编写任何PHP,因此我猜测它在这方面的行为类似于Javascript。对不起,这个确实返回布尔值。我的没有。这只会在任何情况下返回布尔结果。你费心测试了吗?是的。它很好用。请注意,我使用了
,而不是
|
。请看这里:事实上,整个表达式的计算结果是布尔值,但我们不关心这一点。我们只关心
$mode
的值。很抱歉最后的评论。。它真的很管用。。最好是解决meNo问题,别忘了花点时间阅读手册;)这就是我想的,但是性能有什么不同吗?我认为这实际上比
if
慢,因为在这两种情况下都会执行赋值。它不是调用一个方法两次来降低速度吗如果$this->input->get('mode')的操作速度高于O(n),它可能会降低速度,但是如果函数是一个简单的O(n),它就会变成O(n+1)仍然只是O(n)。
O(n+1)
可能相当于
O(n)
,但就绝对速度而言,
O(n)
O(n+1)
O(3000n)
相当于
O(n)
也是。大O表示法显示了
n
变化时的相对速度,而不是某件事情需要多长时间。