Как связать возвращаемую локальную переменную функции с параметром метода?

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

ПРИМЕЧАНИЕ. Я хотел бы получить решение, которое также работает, когда статический метод сделан нестатическим, иначе подойдут два разных решения для этих двух случаев.

1 ответ

Решение

Ответ заключается в использовании 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
Другие вопросы по тегам