Я хотел бы получить следующий код PHP для работы. Часть, которая не работает, — это то, что внутренняя переменная $greetingCount
(локальная переменная возвращаемой функции) не привязана к внешней переменной $greetingCount
(переменная параметра метода).
class Greetings {
public static function getRepeatGreeterFunc($greetingCount) {
$repeatGreeter = function($greeting) {
// I want $greetingCount to bind to the outer $greetingCount here.
// If 4 is passed to getRepeatGreeterFunc, then it should be 4 here,
// so that what I get is a function that prints the greeting 4 times.
for ($i = 0; $i < $greetingCount; $i++) {
echo $greeting . "\n";
}
};
return $repeatGreeter;
}
public function greet() {
$repeatGreeter = self::getRepeatGreeterFunc(4);
call_user_func($repeatGreeter, "HELLO");
}
}
$greetings = new Greetings();
$greetings->greet();
// ВЫХОД:
none
// ОЖИДАЕМЫЙ ВЫХОД:
HELLO
HELLO
HELLO
HELLO
ПРИМЕЧАНИЕ. Мне бы хотелось решение, которое также работает, когда статический метод сделан нестатическим, в противном случае подойдут два разных решения для этих двух случаев.
Ответ заключается в использовании PHP use
ключевое слово:
class Greetings {
public static function getRepeatGreeterFunc($greetingCount) {
$repeatGreeter = function($greeting) use ($greetingCount) {
// I want $greetingCount to bind to the outer $greetingCount here.
// If 4 is passed to getRepeatGreeterFunc, then it should be 4 here,
// so that what I get is a function that prints the greeting 4 times.
for ($i = 0; $i < $greetingCount; $i++) {
echo $greeting . "\n";
}
};
return $repeatGreeter;
}
public function greet() {
$repeatGreeter = self::getRepeatGreeterFunc(4);
call_user_func($repeatGreeter, "HELLO");
}
}
$greetings = new Greetings();
$greetings->greet();
ВЫХОД:
HELLO
HELLO
HELLO
HELLO
Других решений пока нет …