TL; DR: Các when
chức năng là ít hơn syntactic sugar. Nó không hiệu quả hơn các điều kiện thông thường, và (có lẽ) không kém hiệu quả, đủ để lo lắng.
Hãy có một cái nhìn tại when
method's source code:
public function when($value, $callback)
{
$builder = $this;
if ($value) {
$builder = call_user_func($callback, $builder);
}
return $builder;
}
Như bạn có thể thấy, phương pháp when
không làm bất cứ điều gì khác biệt so với if (<your conditional>)
và sau đó gọi hàm callback được cung cấp bởi bạn.
Vì nó hoàn toàn giống với ví dụ có điều kiện đơn giản của bạn nên không thể hiệu quả hơn. Nó có thể sẽ ít hiệu quả hơn, bởi vì nó liên quan đến hai cuộc gọi phương thức bổ sung - tuy nhiên, điều này sẽ rất nhỏ đến nỗi tôi sẽ không lo lắng về bất kỳ tác động hiệu suất nào. Nếu bạn lo lắng về hiệu quả, bạn nên cấu hình cả hai triển khai và chỉ tối ưu hóa nếu nó chứng tỏ là một nút cổ chai.
Lý do thực sự cho sự tồn tại của hàm when
là syntactic sugar. Nó cho phép bạn có điều kiện thêm trở ngại mới cho một truy vấn mà không phá vỡ giao diện thông thạo các 's 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); });
Trái ngược với
if (isset($foo)) {
$q = $q->where('foo', $foo);
}
if (isset($bar)) {
// ...
Trong một số trường hợp điều này có thể chứng minh là có thể đọc được tốt hơn (hay không). Cuối cùng, dù sử dụng when()
hoặc một điều kiện đơn giản thay thế, không có gì khác hơn là sở thích cá nhân.
Wow, bây giờ đó là câu trả lời. Cảm ơn bạn rất nhiều. Không biết về 'cú pháp cú pháp'. Nhân tiện, TL, DR nghĩa là gì? tôi đã đăng câu hỏi ở định dạng không đúng? Tôi là người mới ở đây. –
Vui lòng trợ giúp và chào mừng bạn đến với StackOverflow! TL; DR có nghĩa là * quá dài; đã không đọc * và thường được sử dụng làm tiền tố cho một bản tóm tắt ngắn để anwser dài hơn. – helmbert