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

Posted

技术标签:

【中文标题】是否可以在 PHP 中访问外部局部变量?【英文标题】:Is it possible to access outer local variable in PHP? 【发布时间】:2011-01-25 10:03:59 【问题描述】:

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

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

function foo()

    $l = "xyz";

    function bar()
    
        echo $l;
    
    bar();

foo();

【问题讨论】:

【参考方案1】:
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() 获取我的价值

【讨论】:

【参考方案2】:

您可能可以使用闭包来做到这一点......

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

function foo()

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

foo();

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

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

几个注意事项:

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

更多信息,作为参考,你可以看看手册中的这个页面:Anonymous functions

【讨论】:

为什么要使用嵌套函数? 谁知道^^那不是问题^^;;使用 PHP 5.3 和匿名函数,它对闭包非常有用;;;在 PHP 5.3 之前...我从未在 PHP 中使用过任何嵌套函数 @PascalMARTIN 重要的是,PHP 5.3 之前的嵌套函数不存在。尽管看起来它们是在本地声明的,但它们最终会在全局范围内。我认为现在也是如此,这就是为什么你必须使用匿名函数来实现任何类型的嵌套。 是否有使用这样的所有变量的速记符号? C++ 有一个[&amp;] 表示法(C++ 的[] 等同于PHP 的use())但是PHP 中的use(&amp;) 不起作用。在一个有很多局部变量的函数中,最好能写一些简短的东西而不是use($foo, $bar, /*lots of other variables*/)【参考方案3】:

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

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

如果您同时使用两个功能 - 就像有人在使用勺子,而您想从勺子中取食物 - 您会浪费食物,或者您中的一些人会挨饿。 无论如何-您将不得不以某种困难的方式设置指针。 如果不调用它,就不可能从其他函数或类中获取任何字段。 函数/方法类似于实例——它们需要被调用。

通过使用同步函数访问全局字段来共享公共字段。

【讨论】:

【参考方案4】:

您必须使用use 关键字。

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

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

function foo()  function bar()   

工作原理与:

function foo()  include "file_with_function_bar.php"; 

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

【讨论】:

代词太多!第二次执行会死什么?外部变量,还是内部函数中的use'd 变量?死是什么意思(不是刻薄,只是想知道)。 die 是否意味着该变量无法使用或必须通过其他方式重新建立?我猜它会死掉(在任何意义上),因为它们都指向的共享位置在第一次执行后无法重新指向?如果将变量设为静态然后立即取消设置怎么办? die 表示die("Fatal Error")。 PHP

以上是关于是否可以在 PHP 中访问外部局部变量?的主要内容,如果未能解决你的问题,请参考以下文章

PHP局部变量与全局变量

匿名内部类不能访问外部类方法中的局部变量,除非变量被声明为final类型

php7中之局部变量,全局变量,超全局变量用法和区别

php作用域

在方法中定义的内部类称为局部内部类

JS封闭函数闭包内置对象