Ответ
Область видимости анонимной функции зависит от способа ее определения:
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.