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

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

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

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

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

【问题讨论】:

    标签: php scope


    【解决方案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
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        • 1970-01-01
        • 2020-01-13
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多