Проблема с областью действия переменной PHP внутри фильтра массива


Я пришел из мира JS, и мне трудно понять этот фрагмент кода:

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

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

Вторая строка предназначена только для отладки и выводит заданный код $. Но здесь: if($e->cca2 == $code){ $код, похоже, не определен. Как это вообще возможно? Это работает с $GLOBALS['code'], но я не хочу использовать глобальные. Почему array_filter не имеет доступа к своей собственной области?

Author: Wordpressor, 2017-10-22

3 answers

Вам нужно использовать "использовать".

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

  array_filter(
    $codes,
    function ($e) use($code) {
      if($e->cca2 == $code){
        print_r($e->name->common);
      }
    }
  );
}
 1
Author: Hemen Ashodia, 2017-10-22 13:56:04

$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);
      }
    }
  );
}
 2
Author: ishegg, 2017-10-22 13:56:32

Потому что function() создает свою собственную область. Если вы хотите передать переменную извне во внутреннюю область, вы можете использовать use:

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

Таким образом, использование переменной из внешней области является явным.

 1
Author: MatsLindh, 2017-10-22 13:56:44