Разве PHP-замыкания не имеют доступа к параметрам функции parnt?
Я писал код для PHP 5.3, и я хотел сделать что-то похожее на код, который я показываю ниже. Я ожидаю, что этот код напечатает 'hellohello', но вместо этого он напечатает 'hello' и ошибку.
Похоже, $ внутреннее замыкание не имеет доступа к параметрам внешней функции. Это нормальное поведение? Это ошибка PHP? Я не понимаю, как это можно считать правильным поведением...
<?php
function outer($var) {
print $var;
$inner = function() {
print $var;
};
$inner();
}
outer('hello');
Спасибо!
2 ответа
Вам нужно использовать use
ключевое слово. Смотрите это для более подробной информации.
В Википедии есть объяснение этому:
function getAdder($x)
{
return function ($y) use ($x) {
return $x + $y;
};
}
$adder = getAdder(8);
echo $adder(2); // prints "10"
Здесь функция getAdder() создает замыкание с использованием параметра $x (ключевое слово "use" заставляет получать переменную из контекста), которое принимает дополнительный аргумент $y и возвращает его вызывающей стороне.
Итак, чтобы ваш пример работал так, как вы хотите:
<?php
function outer($var) {
print $var;
$inner = function() use ($var) {
print $var;
};
$inner();
}
outer('hello');
Я предполагаю, что функция $inner не имеет доступа к $var
Попробуй это
function outer($var) {
print $var;
$inner = function($var) {
print $var;
};
$inner($var);
}
outer('hello');