Всем привет. Заметил в коде автозагрузчика композера интересную вещь. Идет замена, как я понял, приватного свойства объекта вне его самого. Попробовал переложить на более простой лад, получилось вот так: PHP: class A { private $foo = 9; public function getVar($var) { return $this->{$var}; } } class B { public function render() { $a = new A; // C::changeVar($a); call_user_func(C::changeVar($a)); echo $a->getVar(foo); } } class C { public static function changeVar(A $a) { return Closure::bind(function () use ($a) { $a->foo = 4; },null,'A'); } } (new B)->render(); Т.е., через Closure я имитирую область видимости класса А и изменяю свойство 'foo'; И, в конечном итоге при чтении свойства 'foo', отображается '4'; Однако, если, закоментить вызов функции через call_user_func и вызвать C::changeVar($a), то значение свойства не изменится, как было равное 9, так и останется. Объясните, пожалуйста, почему так происходит?
А, все, разобрался. При вызове C::changeVar($a) мы получаем объект closure, и чтобы анонимная функция исполнилась необходимо обратиться к объекту, как к методу. Следующее будет работать: PHP: class A { private $foo = 9; public function getVar($var) { return $this->{$var}; } } $a = new A(); (Closure::bind(function () { $this->foo = 4; },$a,A::class))(); echo $a->getVar(foo); // 4