php闭包
php中闭包的使用,需要手动声明要引用的外层函数内的变量,而且还要指定是否是引用的形式,如:use(&$data)。这跟js的闭包有区别。js中,直接就可以引用外层的变量,而且是以引用的形式。区别在于变量的声名:php,变量不需要声明,而且变量的作用域并不会扩散到全局作用域,如果需要使用全局的变量,则需要刻意的指明global $data。而js,则相反,如果想要变量不扩散到全局作用域,则需要用var来声明。而js本身对复杂变量,是引用形式的。
遇到这种困惑,是因为在chunk的callback方法中无法改变外层的变量,故记录本文。
代码:
// 下面的chunk 启动利用use($data) 来访问外部的变量,但是无法传递过去。这是什么呢?要用引用形式
$data = [];
DB::table('log')->orderBy('id','asc')->chunk(100,function($msgs) use(&$data){
foreach($msgs as $msg){
$data[] = $msg->id . $msg->msg ;
}
});
return $data;
作为对比:
// 下面的chunk 启动利用use($data) 来访问外部的变量,但是无法传递过去。这是什么呢?要用引用形式
$data = [1,2,3];
DB::table('log')->orderBy('id','asc')->chunk(100,function($msgs) use($data){
var_dump($data); //每次都打印出 [1,2,3]
$data[]= 4;
foreach($msgs as $msg){
$data[] = $msg->id . $msg->msg ;
}
var_dump($data); //每次都打印出 [1,2,3,4]
});
return $data; //结果还是 [1,2,3]
参考这篇文章:https://blog.csdn.net/echojson/article/details/80633118 讲解的详细一些。