array_filter中的PHP变量范围问题

时间:2017-10-22 13:51:22

标签: php variables scope

我来自JS世界,无法理解这段代码:

function getCountryName($code, $codes){
  print_r($code);

  array_filter(
    $codes,
    function ($e) {
      if($e->cca2 == $code){
        print_r($e->name->common);
      }
    }
  );
}

第二行仅用于调试,它打印给定$ code。但是这里:if($e->cca2 == $code){ $ code似乎未定义。怎么可能呢?它适用于$GLOBALS['code'],但我不想使用全局变量。为什么array_filter无权访问它自己的范围?

3 个答案:

答案 0 :(得分:2)

$code位于getCountryName()的范围内。然后,您有array_filter()的回调,这是一个匿名函数,并且有自己的范围。要访问变量,您需要use它,这将使回调从其父作用域(函数)继承变量:

function getCountryName($code, $codes){
print_r($code);
 array_filter(
    $codes,
    function ($e) use ($code) {
      if($e->cca2 == $code){
        print_r($e->name->common);
      }
    }
  );
}

答案 1 :(得分:1)

你需要使用'使用'。

function getCountryName($code, $codes){
  print_r($code);

  array_filter(
    $codes,
    function ($e) use($code) {
      if($e->cca2 == $code){
        print_r($e->name->common);
      }
    }
  );
}

答案 2 :(得分:1)

因为function()创建了自己的范围。如果要将变量从外部传递到内部范围,可以使用use

array_filter(
  $codes,
  function ($e) use ($code) {
    if($e->cca2 == $code){
      print_r($e->name->common);
    }
  }
);

这样,来自外部范围的变量的使用是明确的。