Как использовать закрытие PHP с предопределенными аргументами / параметрами

То, что я пытаюсь достичь, это:

$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. Я не хочу менять его видимость.

Есть ли способ для этого?

0

Решение

Прочитайте документы: вы можете использовать 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
2

Другие решения

Прочитать о переменная область, $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);
1