Це не вдасться, коли ви спробуєте викликати захищений або приватний метод на ньому, оскільки його використання таким чином вважається викликом іззовні. Наскільки я знаю, це ніяк не можна обійти в 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, він не змінює початкову функцію, а повертає нову .