Closure binding
| Capture | |
| Bind with bindTo | |
| Closure::call | |
| Change scope |
Capture
A closure can capture nearby variables with use. The list is fixed at creation time, so later changes outside stay unseen unless captured by reference.
Capture keeps helpers short, because settings travel with the function instead of passing through every call.
$factor = 3; $mul = function (int $n) use ($factor): int { return $n * $factor; }; echo $mul(10);
Bind with bindTo
A closure defined outside a class has no object context at first. Binding it to an object gives it a working this value.
The second argument sets the scope, which controls access to private and protected members.
class Box { private int $value = 42; } $get = function (): int { return $this->value; }; $box = new Box(); $bound = $get->bindTo($box, Box::class); echo $bound();
Closure::call
Call is a shortcut for one time binding and running. It attaches the closure, calls it with the given arguments, and returns the result.
This form fits tests and debug snippets where a permanent bound copy would only add noise.
class Counter { private int $count = 7; } $read = function (): int { return $this->count; }; echo $read->call(new Counter());
Change scope
Scope decides which private members the closure may see. Binding the same function with another class name changes the visible internals.
Keep this trick in helpers and tests, since reaching around visibility can hide design issues in main code.
class Secret { private string $code = "ABC"; } $peek = function (): string { return $this->code; }; $bound = $peek->bindTo(new Secret(), Secret::class); echo $bound();
Next: composer.json deep dive
Article author: Arthur Isaev