PHP获取方法范围之外的变量

时间:2013-02-05 04:08:26

标签: php scope anonymous-function

我有这个类(例如简单的一个):

<?
class Test {
  public function test1($a) {
    $gen = function() {
      $gen = function() {
        global $a; // no effect
        echo 'a='. $a; // how could i access $a from test1 parameter without passing?
      };
      $gen();
    };
    $gen();
  } 
};

$x = new Test();
$x->test1(123);

有没有办法从最后一个$ gen函数中的test1参数访问$ a而不将它传递给$ gen()函数?

2 个答案:

答案 0 :(得分:2)

您错过了use声明。关于闭包的PHP documentation,请参阅第3个示例。

这将有效:

<?php

class Test {
  public function test1($a) {
    $gen = function() use ($a) {
      $gen = function() use($a) {
        echo 'a='. $a; // how could i access $a from test1 parameter without passing?
      };
      $gen();
    };
    $gen();
  } 
};

$x = new Test();
$x->test1(123);

答案 1 :(得分:2)

PHP中的匿名函数没有JavaScript那样的隐式变量作用域,因此您需要指定需要父作用域中的哪些变量。您可以使用use语法执行此操作:

$var = 123;
$fn = function() use ($var) {
    // you can use $var here
}
$fn();

另请参阅:Closures and scoping