外部からの呼び出しとしてカウントするため、保護されたメソッドまたはプライベートメソッドを呼び出そうとすると失敗します。そこ私の知る限りでは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(); // outputs "Hello world"
、あなたは何$を変更することができます
効果的
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(); // outputs "Bye world"
、anonymus機能は、最初のパラメータは、このポイントを$かを指定するために使用することができbindTo() method、2番目のパラメータのコントロールがあります:これはanonymus機能(閉鎖再バインド)のために、実行時を指し可視性レベルはとなるはずです。 2番目のパラメータを省略すると、可視性は "外側"からの呼び出しのようになります。パブリックプロパティのみにアクセスできます。また、bindToが動作する方法を書き留めて、元の関数を変更しないでください。新しいものを返します。
だけマイナーフォーラムコンベンション - お好みの答えを反映するために質問を編集するよりも、答えを受け入れるために、通常は良いです。主にこれは、応答が永続的にも意味をなさないようにするだけでなく、正解のためのクレジットを与えることです。 – halfer
'$ CI = $ this;'と '$ CI =&$ this;' **は実際には同一ではないことに注意してください。多分あなたの目的のために、しかし彼らは同じではありません。 '$ CI = 'bla'を試してください。 var_dump($ this); 'の両方のバージョンを使用して違いを確認してください。 – Rudie
@Rudieあなたのコメントのために[documentation](http://php.net/manual/en/language.oop5.references.php)を追加しています – steampowered