Ini akan gagal ketika Anda mencoba memanggil metode yang dilindungi atau privat di atasnya, karena menggunakannya dengan cara itu dihitung sebagai panggilan dari luar. Sejauh yang saya tahu, tidak ada cara untuk mengatasi ini di 5.3, tetapi datanglah PHP 5.4, ini akan berfungsi seperti yang diharapkan, di luar kotak:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter();
Terlebih lagi, Anda akan dapat mengubah ke mana $ this menunjuk pada waktu proses, untuk fungsi anonymus (penutupan kembali):
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();
Secara efektif, fungsi anonymus akan memiliki metode bindTo () , di mana parameter pertama dapat digunakan untuk menentukan ke mana $ this menunjuk, dan parameter kedua mengontrol level visibilitas yang seharusnya . Jika Anda menghilangkan parameter kedua, visibilitas akan seperti memanggil dari "luar", misalnya. hanya properti publik yang dapat diakses. Juga catat cara kerja bindTo, ini tidak mengubah fungsi aslinya, ia mengembalikan yang baru .