不知何故,以下结果为 NULL。为什么会这样?我发现知道这一点很重要,因为这些use
语句不支持可变变量。
function a() {
$a = "a";
$aa = function() {
global $a;
var_dump($a);
};
$aa();
}
a();
该值是NULL
因为没有带有 name 的全局变量$a
。
以下将打印“全局”:
$a = "global"; // global variable initialization
function a() {
$a = "a";
$aa = function() {
global $a;
var_dump($a);
};
$aa();
}
a();
global $a
访问一个名为$a
. 它不是函数中的局部变量a
。由于您从未初始化名为 的全局变量$a
,因此它为 NULL。
为了使局部变量在匿名函数中可用,必须使用use
子句捕获它们。局部变量可以通过值或引用来捕获。
如果要按值捕获(这意味着局部变量的值在$a
定义时被复制到闭包中):
function a() {
$a = "a";
$aa = function() use ($a) {
var_dump($a);
};
$aa();
}
a();
如果您想通过引用捕获(这意味着在闭包内它直接引用变量$a
):
function a() {
$a = "a";
$aa = function() use (&$a) {
var_dump($a);
};
$aa();
}
a();
在这种情况下,两者都是相同的。但是如果你在创建闭包之后修改了变量,并且在它运行之前,它会给出不同的结果(按值捕获仍然有以前的值)。
你可以这样写:
function a() {
$a = "a";
function b() {
global $a;
var_dump($a);
};
$aa = "b";
$aa();
}
a();
变量$t
是您可以使用 访问的变量变量$$a
。请注意,在函数内部a()
,$t
从未使用过,所以应该是您想要的。
$t = 3;
$a = 't';
function a()
{
global $a, $$a;
$x = $$a;
$b = function() use ($x) {
echo $x;
};
$b();
}
a();
代码打印3
。
也许您可以引用变量变量。
function a() {
$a = "b";
$b = "variable";
$ref = &$$a;
$aa = function() use ($ref) {
var_dump($ref);
};
$aa();
}
a();
输出:string(8) "variable"