是否可以在PHP中访问外部局部变量?

Mor*_*eng 23 php scope

是否可以在PHP子函数中访问外部局部变量?

在下面的代码中,我想访问$l内部函数栏中的变量.声明$lglobal $l在酒吧不起作用.

function foo()
{
    $l = "xyz";

    function bar()
    {
        echo $l;
    }
    bar();
}
foo();
Run Code Online (Sandbox Code Playgroud)

Pas*_*TIN 39

你可以使用Closure来做那个......


编辑:花了一些时间来记住语法,但这是它的样子:

function foo()
{
    $l = "xyz";
    $bar = function () use ($l)
    {
        var_dump($l);
    };
    $bar();
}
foo();
Run Code Online (Sandbox Code Playgroud)

并且,运行脚本,你会得到:

$ php temp.php
string(3) "xyz"
Run Code Online (Sandbox Code Playgroud)


几点说明:

  • 你必须;在功能声明之后加上一个!
  • 您可以use通过引用变量,使用&之前的名称:use (& $l)

有关更多信息,作为参考,您可以在手册中查看此页面:匿名函数

  • @PascalMARTIN重要的是,PHP 5.3之前的嵌套函数不存在_.尽管看起来他们在当地宣布,但他们最终在全球范围内.我认为现在也是如此,这就是为什么你必须使用匿名函数来实现任何类型的嵌套. (2认同)

Kor*_*nel 7

您必须使用use关键字.

$bar = function() use(&$l) {
};
$bar();
Run Code Online (Sandbox Code Playgroud)

在非常古老的PHP 5.2及更早版本中,这不起作用.你得到的语法不是闭包,而是全局函数的定义.

function foo() { function bar() { } }
Run Code Online (Sandbox Code Playgroud)

与以下相同:

function foo() { include "file_with_function_bar.php"; }
Run Code Online (Sandbox Code Playgroud)

如果你执行foo两次函数,PHP会抱怨你试图重新定义一个(全局)函数bar.