我需要将一个匿名函数传递给Eloquent模型上的静态方法,并让该静态方法在块闭包内调用闭包。目标是类似于以下代码:
class MyModel extends Eloquent {
// ... table stuff
public static function doSomething (Closure $thing) {
$dispatcher = static::getEventDispatcher();
static::unsetEventDispatcher();
static::chunk(100, function ($records) {
foreach($records as $model) {
$thing($model); // not set in this scope
}
});
static::setEventDispatcher($dispatcher);
}
}
//...
MyModel::doSomething(function($m){/*some crypto stuff*/});
$thing
未设置,因为它超出了范围。我想知道是否有一些技巧可以使这项工作。目前,我使用的是非静态方法,并在$thing
表示的闭包周围调用chunk:
class MyModel extends Eloquent {
public function doSomething (Closure $thing) {
// unset event dispatcher
$thing($this);
// reset event dispatcher
}
}
MyModel::chunk(100, function ($records) {
foreach($records as $model) {
$model->doSomething(function($m){/*some crypto stuff*/});
}
}
这是次优的,因为我每次要调用doSomething
时都要编写块循环,并且事件调度程序被删除并为每条记录重置(或者甚至更糟:我必须记住在调用chunk
之前处理事件调度程序,此时我甚至可能不会尝试合并我的代码。
任何人都知道任何可以使这项工作的技巧吗?
答案 0 :(得分:1)
use
关键字允许匿名函数从父作用域继承变量。
class MyModel extends Eloquent {
// ... table stuff
public static function doSomething (Closure $thing) {
$dispatcher = static::getEventDispatcher();
static::unsetEventDispatcher();
// note the use keyword
static::chunk(100, function ($records) use ($thing) {
foreach($records as $model) {
$thing($model); // not set in this scope
}
});
static::setEventDispatcher($dispatcher);
}
}
匿名函数文档showMessage
。 use
关键字显示在示例3中。