【问题标题】:Using global inside a closure in PHP在 PHP 的闭包中使用全局
【发布时间】:2013-09-07 16:28:56
【问题描述】:

不知何故,以下结果为 NULL。为什么会这样?我觉得知道这一点很重要,因为use 语句不支持可变变量。

function a() {
    $a = "a";
    $aa = function() {
        global $a;
        var_dump($a);
    };
    $aa();
}
a();

【问题讨论】:

    标签: php variables closures global


    【解决方案1】:

    该值为NULL,因为没有名称为$a 的全局变量。

    以下将打印“全局”:

    $a = "global"; // global variable initialization
    
    function a() {
        $a = "a";
        $aa = function() {
            global $a;
            var_dump($a);
        };
        $aa();
    }
    a();
    

    【讨论】:

    • 请阅读问题。尽管您的假设是正确的,但我必须引用一个变量变量。
    • @user2180613:您问“为什么会这样?”,他回答“因为没有名称为 $a 的全局变量”。你还想要什么?
    【解决方案2】:

    你可以这样写:

    function a() {
        $a = "a";
        function b() {
            global $a;
            var_dump($a);
        };
        $aa = "b";
        $aa();
    }
    a();
    

    【讨论】:

    • 不适用。用例需要一个闭包,因此是个问题。
    【解决方案3】:

    也许你可以引用变量变量。

    function a() {
    
        $a = "b";
        $b = "variable";
    
        $ref = &$$a;
    
        $aa = function() use ($ref) {
            var_dump($ref);
        };
        $aa();
    }
    a();
    

    哪个输出:string(8) "variable"

    【讨论】:

      【解决方案4】:

      变量$t 是您可以使用$$a 访问的变量变量。请注意,在函数a() 内部,$t 从未使用过,所以应该是你想要的。

      $t = 3;
      $a = 't';
      function a()
      {
          global $a, $$a;
          $x = $$a;
          $b = function()  use ($x) {
              echo $x;
          };
          $b();
      }
      a();
      

      代码打印3

      【讨论】:

      • a 的范围不应该被留下。 global 代表我的选择不正确。
      • 好吧,在这种情况下,你应该更好地解释你想要什么。
      【解决方案5】:

      global $a 访问一个名为$a全局变量。它不是函数a 中的局部变量。由于您从未初始化名为 $a 的全局变量,因此它为 NULL。

      为了使局部变量在匿名函数中可用,必须使用use 子句捕获它们。局部变量可以通过值或引用来捕获。

      如果你想按值捕获(这意味着局部变量$a的值在定义时被复制到闭包中):

      function a() {
          $a = "a";
          $aa = function() use ($a) {
              var_dump($a);
          };
          $aa();
      }
      a();
      

      如果你想通过引用捕获(这意味着在闭包内部它直接引用变量$a):

      function a() {
          $a = "a";
          $aa = function() use (&$a) {
              var_dump($a);
          };
          $aa();
      }
      a();
      

      在这种情况下,两者都是一样的。但是如果你在创建闭包之后修改了变量,并且在它运行之前,它会给出不同的结果(按值捕获仍然有以前的值)。

      【讨论】:

        猜你喜欢
        • 2020-05-23
        • 2011-09-12
        • 2011-01-17
        • 2011-05-02
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 2014-06-15
        • 1970-01-01
        相关资源
        最近更新 更多