То, что я пытаюсь достичь, это:
$x = 5;
$b = function ($x) {
echo 'This should be 5 :' . $x;
};
function a($fn){
echo 'In a ';
$fn();
}
a($b);
Когда вы запускаете этот код, мы получаем
В
Это должно быть 5: 5
Вместо этого мы получаем
Предупреждение: отсутствует аргумент 1 для {closure} (), вызванного в
writecodeonline.com/php в строке 10 и определяется в строке 3 Это должно
быть 5
Я не хочу переопределять аргумент, который я уже определил
Чего я не хочу, так это прятать $ x. Я не хочу менять его видимость.
Есть ли способ для этого?
Прочитайте документы: вы можете использовать use
выражение для этого:
$x = 5;
$b = function () use ($x) {
echo 'This is x: ' . $x . "\n";
};
$b();
$c = function ($fn) {
echo 'In c: ';
$fn();
};
$c($b);
$x = 10;
$c($b);
Выход:
This is x: 5
In c: This is x: 5
In c: This is x: 5
Обратите внимание, что, несмотря на изменение $x
позже назначенное значение не изменяется. Вы можете достичь этого, передав переменную по ссылке:
$x = 5;
$b = function () use (&$x) { // << Note the difference here
echo 'This is x: ' . $x . "\n";
};
$b();
$c = function ($fn) {
echo 'In c: ';
$fn();
};
$c($b);
$x = 10;
$c($b);
Выход:
This is x: 5
In c: This is x: 5
In c: This is x: 10
Прочитать о переменная область, $x
не может быть автоматически виден внутри функции a()
если вы не передадите аргумент в функцию a()
$x = 5;
$b = function ($x) {
echo 'This should be 5 :' . $x;
};
function a($fn, $value) {
echo 'In a ';
$fn($value);
}
a($b, $x);