是"和"关键字与PHP中的if(TRUE)相同

时间:2018-05-08 06:55:55

标签: php laravel laravel-5

在Laravel 5的模型类中,我遇到了以下代码,我不确定它的含义。

$query = User::query();

\Request::input('name') and $query->where('name', 'like', '%' . \Request::input('name') . '%');
\Request::input('email') and $query->where('email', 'like', '%' . \Request::input('email') . '%');

return $query->paginate(15);

是否与以下代码相同?

if (\Request::input('name')) {
    $query->where('name', 'like', '%' . \Request::input('name') . '%');
}

if (\Request::input('email')) {
    $query->where('email', 'like', '%' . \Request::input('email') . '%');
}

1 个答案:

答案 0 :(得分:3)

它是short-circuit evaluation。 PHP &&and运算符大部分都相同(优先级除外,我们可以在这里忽略)。所有布尔运算符都适用于短路评估;即0 and 1永远不会是true因为0 falsey ,所以PHP甚至不需要评估第二个操作数1。几乎所有语言都这样做。

此处用作速记if。如果\Request::input('name')是真实的,则会评估第二个操作数$query->...,否则将跳过它。

这在风格上是有问题的,很难得到认可,尤其是因为它会产生这样的问题。你应该写一个传统的if,它更容易理解,你需要保留的线路不缺。