在闭包中初始化父作用域变量

hac*_*kel 2 php

为了从闭包内初始化父作用域中的变量,我可以这样做:

$f = function () use (&$a) {
  $a = 1;
};
$f();
$a === 1; // true
Run Code Online (Sandbox Code Playgroud)

我的问题是,这是副作用还是我将来可以依赖的预期行为?我知道我可以$a = null在定义闭包之前简单地添加,但是如果有很多变量,这可能会变得很难看。

Abr*_*ver 5

这是由于引用而导致的预期行为,来自手册PHP:引用的作用

笔记

如果通过引用分配、传递或返回未定义的变量,它将被创建

即使在调用函数之前,也会创建变量并将其设置为,NULL因为use在函数创建时导入变量。在函数定义之前,您会收到一条通知:未定义的变量:a

var_dump($a);

$f = function () use (&$a) {
  //$a = 1;
};

var_dump($a);

$f();

var_dump($a);
Run Code Online (Sandbox Code Playgroud)

产量:

Notice: Undefined variable: a
NULL
NULL
NULL
Run Code Online (Sandbox Code Playgroud)