Üzerinde korumalı veya özel bir yöntemi çağırmaya çalıştığınızda başarısız olur, çünkü onu bu şekilde kullanmak dışarıdan arama olarak sayılır. Bildiğim kadarıyla 5.3'te bunu aşmanın bir yolu yok, ancak PHP 5.4 geliyor, kutudan çıktığı gibi beklendiği gibi çalışacak:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter();
Dahası, anonymus işlevleri için (kapatma yeniden bağlama) çalışma zamanında $ this'in işaret ettiği şeyi değiştirebileceksiniz:
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();
Etkili bir şekilde, anonymus işlevleri bir bindTo () yöntemine sahip olacaktır ; burada birinci parametre $ this'in neyi işaret ettiğini belirtmek için kullanılabilir ve ikinci parametre görünürlük düzeyinin ne olması gerektiğini kontrol eder . İkinci parametreyi atlarsanız, görünürlük "dışarıdan" arama gibi olacaktır, örn. yalnızca genel mülklere erişilebilir. Ayrıca, bindTo'nun çalışma şeklini not edin, orijinal işlevi değiştirmez, yenisini döndürür .