保護されたメソッドまたはプライベートメソッドを呼び出そうとすると失敗します。そのように使用すると、外部からの呼び出しとしてカウントされるためです。私の知る限り、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が指すものを指定し、2番目のパラメーターで可視性レベルを制御します。2番目のパラメータを省略すると、可視性は「外部」から呼び出すようなものになります。パブリックプロパティにのみアクセスできます。また、bindToの動作方法にも注意してください。元の関数は変更されず、新しい関数が返されます。