จะล้มเหลวเมื่อคุณพยายามเรียกใช้เมธอดที่ได้รับการป้องกันหรือเป็นส่วนตัวเนื่องจากการใช้วิธีนี้จะนับเป็นการโทรจากภายนอก ไม่มีวิธีแก้ไขสิ่งนี้ใน 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();
ยิ่งไปกว่านั้นคุณจะสามารถเปลี่ยนสิ่งที่ $ นี้ชี้ไปที่รันไทม์สำหรับฟังก์ชัน anonymus (การปิด rebinding):
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();
ได้อย่างมีประสิทธิภาพฟังก์ชั่น Anonymus จะมีbindTo () วิธีการที่พารามิเตอร์แรกสามารถใช้ในการระบุสิ่งที่ $ จุดนี้และการควบคุมพารามิเตอร์ที่สองสิ่งที่ระดับการแสดงผลที่ควรจะเป็น หากคุณไม่ใส่พารามิเตอร์ที่สองการมองเห็นจะเหมือนกับการเรียกจาก "ภายนอก" เช่น สามารถเข้าถึงได้เฉพาะคุณสมบัติสาธารณะเท่านั้น นอกจากนี้ยังให้จดบันทึกทาง bindTo ทำงานก็ไม่ได้ปรับเปลี่ยนฟังก์ชั่นเดิมมันจะกลับมาใหม่