PHP中奇怪的闭包行为

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