在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') . '%');
}
答案 0 :(得分:3)
它是short-circuit evaluation。 PHP &&
和and
运算符大部分都相同(优先级除外,我们可以在这里忽略)。所有布尔运算符都适用于短路评估;即0 and 1
永远不会是true
因为0
falsey ,所以PHP甚至不需要评估第二个操作数1
。几乎所有语言都这样做。
此处用作速记if
。如果\Request::input('name')
是真实的,则会评估第二个操作数$query->...
,否则将跳过它。
这在风格上是有问题的,很难得到认可,尤其是因为它会产生这样的问题。你应该写一个传统的if
,它更容易理解,你需要保留的线路不缺。