PHP › Closures & Anonymous Functions

How does binding a closure to a specific object or class using bindTo or Closure::bind allow it to access private properties and methods it otherwise could not?

Advanced

Answer

Closures created outside of a class normally have no special access to that class's private or protected members, but the bindTo method or the static Closure::bind method let you create a new closure that is bound to a specific object instance, giving it the same access rights as if it were defined as a method within that class, which is an advanced technique occasionally used in testing frameworks or certain metaprogramming scenarios to inspect or manipulate otherwise inaccessible internal state.
class Account {
    private $balance = 100;
}
$getBalance = function () {
    return $this->balance;
};
$bound = Closure::bind($getBalance, new Account(), Account::class);
echo $bound();
Real-world example A testing framework uses Closure::bind to create a special closure that can inspect a class's normally private internal properties directly, allowing test assertions to verify internal state without needing to expose that state through a public method solely for testing purposes.

Common follow-ups: What are the legitimate use cases for this technique outside of testing frameworks?;Does using bindTo have any measurable performance overhead compared to a normal method call?