[英]Is there a good reason to use a closure instead of a for loop in this case?
我正在使用Laravel 4; 有問題的模型擴展了Eloquent
。
我在listing
和photo
兩個模型之間建立了聯系。 我正在匯編一個沒有任何photos
的listings
。 雄辯有發現, 確實有相關記錄的記錄一個方便的方法:
$listings = Listing::has('photos')->get();
我不知道has
方法的逆函數的存在。 如果有一個,請告訴我。
無論如何,這就是我解決問題的方式:
// fetch all the listings, eagerly loading the photos relationship
$listings = Listing::with('photos')->get();
foreach ($listings as $key => $listing)
{
// if the listing has photos, remove it from the collection
if (count($listing->photos) != 0)
{
unset($listings[$key]);
}
}
這很好,但是我正在嘗試擴展我的知識。 閱讀有關收集的Laravel文檔 ,有一個過濾收集的示例:
$users = $users->filter(function($user)
{
if($user->isAdmin())
{
return $user;
}
});
我使用以下方法重寫了for
循環:
$listings = $listings->filter(function($listing)
{
// Keep listings with no photos
if (count($listing->photos) == 0)
{
return $listing;
}
});
兩種情況下,生成的$listings
對象相同。 是否有令人信服的理由選擇一種方法而不是另一種方法,或者僅僅是個人喜好問題?
兩者之間的選擇取決於個人喜好。
無論如何,有些話:
如果向后兼容是一個問題,則不要使用閉包。 它們是PHP 5.3語言構造。 但是,如今這不再是問題。
唯一可以發揮重要作用的是性能。 但是for循環與PHP中的閉包差不多快 。 而且,如果性能確實成為問題,則應該完全更改方法,並且僅首先獲取正確的記錄。
至於可讀性:對於沒有經驗的PHP程序員,for循環方法將更容易理解,而一旦您了解了使用閉包進行過濾,閉包方法就會更加清晰。 無論如何,使用閉包進行過濾更“現代”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.