PHP集合类方法中的非局部变量

PHP集合类方法中的非局部变量,php,laravel,collections,Php,Laravel,Collections,我正在考虑在我的PHP应用程序中实现一个集合类,但是,我对使用该类有一些疑问 我的一些方法基于Laravel集合类() 如果我正在使用。每种方法: public function each($callback) { foreach ($this->items as $key => $item) { if ($callback($item, $key) === false) { break; } } re

我正在考虑在我的PHP应用程序中实现一个集合类,但是,我对使用该类有一些疑问

我的一些方法基于Laravel集合类()

如果我正在使用。每种方法:

public function each($callback)
{
    foreach ($this->items as $key => $item) {
        if ($callback($item, $key) === false) {
            break;
        }
    }

    return $this;
}
如何在回调中使用非局部变量?例如,我有一个课程集合和一个用户集合

$courses = new Collection($this->getCourses());
$users = new Collection($this->getUsers());

// I need to loop through all courses and within each course, loop through   
// all users
$courses->each(function($course, $courseKey) {

    // How can I make it so $users is available here?

    $users->each(function($user, $userKey) {

        // How can I make it so $course is available here?

        // ...
    });
});
我试图完成的是一个糟糕的实践吗?我应该使用
global
关键字,还是这也是一种不好的做法?

仔细研究。您希望做的是围绕变量创建一个闭包(手册使用短语“从父范围继承变量”)。这样的事情应该适合你:

$courses = new Collection($this->getCourses());
$users = new Collection($this->getUsers());

$courses->each(function($course, $courseKey) use($users) {

    // $users is now available in this scope

    $users->each(function($user, $userKey) use($course) {

        // $course is now available in this scope

    });
});
您不需要使用关键字,因为它将特别引用存在于全局范围中的变量,我怀疑您的变量是否真的存在(如果它们在函数或类中声明,则它们不是全局的)。手册中的相关引用:

从父范围继承变量与使用全局变量不同。全局变量存在于全局范围中,无论执行什么函数,全局范围都是相同的。闭包的父作用域是声明闭包的函数(不一定是从中调用闭包的函数)


这就是我要找的。可用的use()语法是什么版本的PHP。对于这个特定的应用程序,我一直停留在PHP5.3.3上,所以我只是想确定一下。现在还不是很确定,但我相信匿名函数在5.3中已经可用,所以我认为这也应该是可行的。我会反复检查的。我在PHP5.3.3中测试了它,它成功了。@Sean手册中没有具体说明
use
本身,但是关键字有意义的两个不同领域(名称空间和匿名函数)都是在5.3中引入的。很高兴你让它工作了。