Анонімні й стрілкові функції в PHP - об'єкти класу Closure. Цей клас має методи для керування контекстом виконання.
Closure::fromCallable() - створює замикання з будь-якого callable: імені функції, [$object, 'method'], [Class::class, 'staticMethod']. Сьогодні замість нього пишуть first-class callable syntax:
$fn = Closure::fromCallable([$this, 'normalize']);
$fn = $this->normalize(...); // те саме, з PHP 8.1
bind() / bindTo() - змінюють $this і область видимості класу (scope) замикання:
final class Counter
{
private int $count = 5;
}
$peek = function (): int {
return $this->count; // приватна властивість
};
$bound = Closure::bind($peek, new Counter(), Counter::class);
echo $bound(); // 5
Другий аргумент - новий $this, третій - клас, від імені якого замикання має доступ до приватних і захищених членів.
call() - тимчасово прив'язати й одразу викликати: $peek->call(new Counter()).
Де це використовують:
- Макроси в Laravel (
Collection::macro('toUpper', function () { return $this->map(...); })) - замикання прив'язується до екземпляра колекції, тож$thisусередині - колекція. - Тести й налагодження - доступ до приватного стану без Reflection.
- DSL і конфігурація - виконати колбек «всередині» об'єкта-будівника.
Застереження: доступ до приватних членів через bind обходить інкапсуляцію. У робочому коді це майже завжди ознака, що потрібен публічний метод. Статичне замикання (static function) прив'язати до об'єкта не можна взагалі.