Он потерпит неудачу, когда вы попытаетесь вызвать на нем защищенный или частный метод, потому что его использование таким образом считается вызовом извне. Насколько я знаю, в версии 5.3 нет способа обойти это, но с выходом PHP 5.4 он будет работать, как ожидалось, из коробки:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter();
Более того, вы сможете изменить то, на что указывает $ this во время выполнения, для анонимных функций (повторная привязка закрытия):
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
class Bye {
private $message = "Bye world\n";
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$bye = new Bye();
$byePrinter = $helloPrinter->bindTo($bye, $bye);
$byePrinter();
Фактически, анонимные функции будут иметь метод bindTo () , где первый параметр может использоваться, чтобы указать, на что указывает $ this, а второй параметр контролирует, каким должен быть уровень видимости . Если вы опустите второй параметр, видимость будет похожа на вызов "извне", например. доступны только общедоступные свойства. Также обратите внимание на то, как работает bindTo: он не изменяет исходную функцию, а возвращает новую .