在这种情况下,是否有充分的理由使用闭包而不是for循环?

时间:2014-02-19 15:53:21

标签: php closures php-closures

我正在使用Laravel 4;有问题的模型扩展Eloquent

我在两个模型listingphoto之间建立了关系。我正在编译一个没有任何相应listings的{​​{1}}集合。 Eloquent有一种方便的方法来查找 DO 有相关记录的记录:

photos

我不知道$listings = Listing::has('photos')->get(); 方法的倒数的存在。 如果有,请告诉我。

无论如何,这就是我解决问题的方法:

has

这很好用,但我正在努力扩展我的知识。阅读Laravel documentation on collections,有一个过滤集合的例子:

// 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]);
    }
}

我使用这种方法重写了$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; } }); 对象在两种情况下都是相同的。是否有任何令人信服的理由选择一种方法而不是另一种方法,或者仅仅是个人偏好的问题?

1 个答案:

答案 0 :(得分:1)

两者之间的选择取决于个人偏好。

无论如何都有一些评论:

如果向后兼容性存在问题,请不要使用闭包。它们是PHP 5.3语言结构。不过,现在这不应该是一个问题了。

唯一可以发挥重要作用的是性能。但是for loops are more or less equally fast as closures in PHP。如果性能确实成为问题,您应该完全改变方法,并且首先只获取正确的记录。

至于可读性:对于没有经验的PHP程序员来说,for循环方法会更容易理解,而一旦你理解了使用闭包的过滤,闭包方法会更清晰一些。无论如何,用封盖过滤更“现代”。