簡體   English   中英

在這種情況下,是否有充分的理由使用閉包而不是for循環?

[英]Is there a good reason to use a closure instead of a for loop in this case?

我正在使用Laravel 4; 有問題的模型擴展了Eloquent

我在listingphoto兩個模型之間建立了聯系。 我正在匯編一個沒有任何photoslistings 雄辯有發現, 確實有相關記錄的記錄一個方便的方法:

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM