什么是use?
use 表示从当前作用域继承变量或值。参数可以从任何地方给出,但used 变量只能在某些情况下存在。因此,您可能无法在未设置 used 变量的范围之外使用闭包:
<?php
header('Content-Type: text/plain; charset=utf-8');
$fn = function($x)use($y){
var_dump($x, $y);
};
$fn(1);
?>
演出:
Notice: Undefined variable: y in script.php on line 4
int(1)
NULL
但是,您可以使用参数化闭包而无需这种范围依赖性:
<?php
header('Content-Type: text/plain; charset=utf-8');
$fn = function($x, $y = null){
var_dump($x, $y);
};
$fn(1);
?>
查看相关问题: In PHP 5.3.0, what is the function "use" identifier?。
有什么优势?
use 构造的主要用例之一是使用闭包作为其他函数(方法)的回调。在这种情况下,您必须遵循固定数量的函数参数。因此,将额外参数(变量)传递给回调的唯一方法是 use 构造。
<?php
header('Content-Type: text/plain; charset=utf-8');
$notWannaSeeThere = 15;
$array = [ 1, 15, 5, 45 ];
$filter = function($value) use ($notWannaSeeThere){
return $value !== $notWannaSeeThere;
};
print_r(array_filter($array, $filter));
?>
演出:
Array
(
[0] => 1
[2] => 5
[3] => 45
)
在这个例子中,array_filter() 使用了$filter 闭包,并且只用一个参数调用 - 数组元素值(我们“不能”强制它使用额外的参数)。不过,我们可以传递其他变量,这些变量在父作用域中可用。
参考:anonymous functions.
从父作用域继承变量与使用不同
全局变量。