TL; DR:的when
功能是少許超過syntactic sugar。它並不比常規條件更有效,並且(可能)效率不足以擔心。
讓我們來看看when
method's source code:
public function when($value, $callback)
{
$builder = $this;
if ($value) {
$builder = call_user_func($callback, $builder);
}
return $builder;
}
正如你所看到的,when
方法不會做任何事情比if (<your conditional>)
不同,然後調用由您提供的回調函數。
因爲它的確和你簡單的條件例子完全一樣,所以它不可能是更有效的。它的效率可能稍微低一些,因爲它涉及到兩個額外的方法調用 - 但是,這會很微不足道,我不會擔心任何性能影響。如果您擔心效率問題,則應該分析兩種實施方案,只有在證明是瓶頸時才進行優化。
when
函數存在的真正原因是syntactic sugar。它允許你有條件地添加新的約束來查詢,而打破QueryBuilder
的流暢界面:
$q = $q
->when(isset($foo), function() use ($foo) { return $q->where('foo', $foo); })
->when(isset($bar), function() use ($bar) { return $q->where('bar', $bar); })
->when(isset($baz), function() use ($baz) { return $q->where('baz', $baz); });
與之相對
if (isset($foo)) {
$q = $q->where('foo', $foo);
}
if (isset($bar)) {
// ...
在某些情況下,這可能被證明是更好的可讀性(或不)。最後,無論是使用when()
還是簡單的條件代替,無非就是個人品味。
哇,現在這是一個答案。非常感謝。不知道'語法糖'。順便說一下,TL,DR是什麼意思?我是否以不良格式發佈了問題?我在這裏有點新鮮感。 –
樂於幫忙,歡迎來到StackOverflow! TL; DR意味着*太長;沒有閱讀*,並且經常用作前綴以作爲較長的縮略圖的簡短摘要。 – helmbert