self
ชี้ไปที่คลาสที่เขียน
ดังนั้นหากเมธอด getInstance ของคุณอยู่ในชื่อคลาสMyClass
บรรทัดต่อไปนี้:
self::$_instance = new self();
จะทำเช่นเดียวกับ:
self::$_instance = new MyClass();
แก้ไข: ข้อมูลเพิ่มเติมอีกสองสามข้อหลังจากความคิดเห็น
หากคุณมีสองคลาสที่ขยายซึ่งกันและกันคุณมีสองสถานการณ์:
getInstance
ถูกกำหนดไว้ในคลาสย่อย
getInstance
ถูกกำหนดไว้ในคลาสพาเรนต์
สถานการณ์แรกจะเป็นเช่นนี้ (ฉันได้ลบโค้ดที่ไม่จำเป็นทั้งหมดออกไปแล้วสำหรับตัวอย่างนี้ - คุณจะต้องเพิ่มกลับเข้าไปเพื่อให้ได้พฤติกรรมของซิงเกิลตัน) *:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
ที่นี่คุณจะได้รับ:
object(MyChildClass)#1 (0) { }
ซึ่งมีความหมายself
ว่าMyChildClass
- คือคลาสที่เขียน
สำหรับสถานการณ์ที่สองรหัสจะมีลักษณะดังนี้:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
และคุณจะได้ผลลัพธ์ประเภทนี้:
object(MyParentClass)#1 (0) { }
ซึ่งหมายถึงself
วิธีการMyParentClass
- คือที่นี่เกินไปชั้นในที่จะเขียน
ด้วย PHP <5.3 "คลาสที่จะเขียน" มีความสำคัญและบางครั้งอาจทำให้เกิดปัญหาได้
นั่นเป็นเหตุผลที่ PHP 5.3 แนะนำการใช้งานใหม่สำหรับstatic
คำหลัก: ตอนนี้สามารถใช้ได้ตรงกับที่เราใช้self
ในตัวอย่างเหล่านี้:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
แต่มีstatic
แทนself
ตอนนี้คุณจะได้รับ:
object(MyChildClass)#1 (0) { }
ซึ่งหมายความว่าการstatic
จัดเรียงคะแนนไปยังชั้นเรียนที่ใช้ (เราใช้MyChildClass::getInstance()
) ไม่ใช่จุดที่ถูกเขียน
แน่นอนพฤติกรรมของself
ไม่ได้รับการเปลี่ยนแปลงเพื่อไม่ทำลายแอปพลิเคชันที่มีอยู่ - PHP 5.3 เพิ่งเพิ่มพฤติกรรมใหม่รีไซเคิลไฟล์static
คำหลัก
และเมื่อพูดถึง PHP 5.3 คุณอาจต้องการดูที่หน้าLate Static Bindingsของคู่มือ PHP