Проблема с областью действия переменной 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 не имеет доступа к своей собственной области?
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);
}
}
);
}
$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);
}
}
);
}
Потому что function()
создает свою собственную область. Если вы хотите передать переменную извне во внутреннюю область, вы можете использовать use
:
array_filter(
$codes,
function ($e) use ($code) {
if($e->cca2 == $code){
print_r($e->name->common);
}
}
);
Таким образом, использование переменной из внешней области является явным.