PHP集合类方法中的非局部变量
我正在考虑在我的PHP应用程序中实现一个集合类,但是,我对使用该类有一些疑问 我的一些方法基于Laravel集合类() 如果我正在使用。每种方法: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
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中引入的。很高兴你让它工作了。