self
उस कक्षा को इंगित करता है जिसमें यह लिखा गया है।
इसलिए, यदि आपकी getInstance विधि एक वर्ग नाम में है MyClass
, तो निम्न पंक्ति:
self::$_instance = new self();
के रूप में ही करेंगे:
self::$_instance = new MyClass();
संपादित करें: टिप्पणियों के बाद एक और अधिक informations।
यदि आपके पास दो कक्षाएं हैं जो एक-दूसरे का विस्तार करती हैं, तो आपके पास दो स्थितियां हैं:
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 के बारे में बोलते हुए, आप PHP मैनुअल के लेट स्टेटिक बाइंडिंग पृष्ठ पर एक नज़र डालना चाहते हैं ।