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