0

Я хотел бы получить следующий 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 

Примечание: Я хотел бы решение, которое также работает, когда статический метод сделан нестатический, в противном случае два для этих двух случаев будут выполнены разные решения.

ответ

0

Ответ сделать использование 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