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

时间:2010-03-09 12:21:08

标签: php scope

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

在下面的代码中,我想访问内部函数栏中的变量$l。在栏中将$l声明为global $l不起作用。

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

    function bar()
    {
        echo $l;
    }
    bar();
}
foo();

4 个答案:

答案 0 :(得分:38)

你可能会使用Closure来做这件事......


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

function foo()
{
    $l = "xyz";
    $bar = function () use ($l)
    {
        var_dump($l);
    };
    $bar();
}
foo();

然后,运行脚本,你会得到:

$ php temp.php
string(3) "xyz"


几点注意事项:

  • 您必须在函数声明后添加;
  • 您可以通过引用use变量,在其名称前加&use (& $l)

有关更多信息,作为参考,您可以查看手册中的此页面:Anonymous functions

答案 1 :(得分:6)

您必须使用use关键字。

$bar = function() use(&$l) {
};
$bar();

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

function foo() { function bar() { } }

的作用与:

相同
function foo() { include "file_with_function_bar.php"; }

如果您执行两次函数foo,PHP会抱怨您已尝试重新定义(全局)函数bar

答案 2 :(得分:0)

您可以通过以下方式读取默认值:

function(){
    return preg_match(
                     "yourVar = \d+"
                   ,  str_file_get_contents(functionFile)
                  ,   arrayToPutFieldsValue
           );
 }

如果您要同时使用两个功能块-就像某人正在使用勺子,并且您想从该勺子中获取食物-您会浪费食物,否则您中的一些人会饿死。 无论如何-您将必须以某种方式设置指针。 不调用其他函数或类的任何字段都是不可能的。 函数/方法类似于实例-需要调用它们。

通过访问具有同步功能的全局字段来共享公共字段。

答案 3 :(得分:0)

function a()
{

    function val1($arg=null)
    {
        static $a;
        if ($arg !== null) $a = $arg;
        else return $a;
    }


    function b()
    {
        val1('1234');
        echo val1() . '<br>';  // shows: 1234
        val1('my custom data');
        echo val1() . '<br>';  // shows: my custom data
    }
    b();


}
a();

使用 val1('my custom data') 设置我的值

使用val1()获取我的价值