Какой контекст (область видимости) доступен анонимной функции, определенной внутри метода класса в PHP?

«Какой контекст (область видимости) доступен анонимной функции, определенной внутри метода класса в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Область видимости анонимной функции зависит от способа ее определения:

1. Обычная анонимная функция (с function() use (...)):

  • Не имеет доступа к переменным родительской области (метода) и к $this по умолчанию.
  • Доступ нужно явно указать через конструкцию use.
  • Начиная с PHP 7.1, для захвата $this его также нужно явно указать в use, иначе будет фатальная ошибка.
class MyClass {
    private $prop = 'private';
    public function method() {
        $localVar = 'local';
        // Явный захват переменных и $this
        $func = function() use ($localVar, $this) {
            echo $localVar; // 'local'
            echo $this->prop; // 'private' (доступ к private свойству!)
        };
        $func();
    }
}

2. Стрелочная функция (PHP 7.4+):

  • Автоматически захватывает переменные из родительской области видимости по значению.
  • Если определена в нестатическом методе, автоматически захватывает $this.
  • Более лаконичный синтаксис.
class MyClass {
    private $prop = 'private';
    public function method() {
        $localVar = 'local';
        // Автоматический захват $localVar и $this
        $arrowFunc = fn() => $localVar . ' ' . $this->prop;
        echo $arrowFunc(); // 'local private'
    }
}

Важное отличие: В статическом методе $this не определен, поэтому его нельзя захватить ни одним из способов. Стрелочные функции, определенные в статическом контексте, также не будут иметь доступа к $this.