不知何故,以下结果为NULL。为什么会这样?我发现知道很重要,因为use
语句不支持变量变量。
function a() {
$a = "a";
$aa = function() {
global $a;
var_dump($a);
};
$aa();
}
a();
答案 0 :(得分:1)
值为NULL
,因为没有名称为$a
的全局。
以下将打印“global”:
$a = "global"; // global variable initialization
function a() {
$a = "a";
$aa = function() {
global $a;
var_dump($a);
};
$aa();
}
a();
答案 1 :(得分:0)
你可以这样写:
function a() {
$a = "a";
function b() {
global $a;
var_dump($a);
};
$aa = "b";
$aa();
}
a();
答案 2 :(得分:0)
也许你可以引用变量变量。
function a() {
$a = "b";
$b = "variable";
$ref = &$$a;
$aa = function() use ($ref) {
var_dump($ref);
};
$aa();
}
a();
输出:string(8) "variable"
答案 3 :(得分:0)
变量$t
是您可以使用$$a
访问的变量变量。请注意,在函数a()
中,永远不会使用$t
,因此应该是您想要的。
$t = 3;
$a = 't';
function a()
{
global $a, $$a;
$x = $$a;
$b = function() use ($x) {
echo $x;
};
$b();
}
a();
代码打印3
。
答案 4 :(得分:0)
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();
在这种情况下,两者都是相同的。但是如果你在创建闭包之后修改了变量,并且在它运行之前,它会产生不同的结果(按值捕获仍然具有前一个值)。