Sir*_*ifi 1 php closures scope
在JavaScript中给出此代码:
function getFunc(){
var myVar = 1;
function inc(var1) {
myVar = myVar + 1;
return var1 + myVar;
}
return inc;
}
var inc = getFunc();
console.log(inc(5));
console.log(inc(6));
Run Code Online (Sandbox Code Playgroud)
如果您在浏览器控制台中运行此代码,则会为您提供7和9.我在C#中编写了相同的代码,它给了我相同的结果:
static void Main(string[] args)
{
var inc = GetAFunc();
Console.WriteLine(inc(5));
Console.WriteLine(inc(6));
Console.ReadKey();
}
public static Func<int, int> GetAFunc()
{
var myVar = 1;
Func<int, int> inc = delegate(int var1)
{
myVar = myVar + 1;
return var1 + myVar;
};
return inc;
}
Run Code Online (Sandbox Code Playgroud)
但为什么不在PHP中给出相同的结果呢?
function getFunc() {
$myVar = 1;
$inc = function($var1) use ($myVar) {
$myVar = $myVar + 1;
return $var1 + $myVar;
};
return $inc;
}
$inc = getFunc();
echo $inc(5);
echo $inc(6);
Run Code Online (Sandbox Code Playgroud)
它给了我7和8!
他们为什么不以同样的方式工作?代码有问题吗?
小智 9
这是因为如果您想修改另一个范围中的变量,您需要在PHP中显式化.您可以通过定义$var作为参考来完成此操作&.例如:use (&$var).
以下代码将为您提供预期的行为:
function test() {
$var = 1;
$inc = function($num) use (&$var) {
var_dump($var);
$var = $var + 1;
return $num + $var;
};
return $inc;
}
$test = test();
echo $test(5);
echo $test(6);
Run Code Online (Sandbox Code Playgroud)
希望这有助于:) x