परिचय
PHP में लेट स्टैटिक बाइंडिंग की यह सुविधा स्टैटिक इनहेरिटेंस में कॉल की गई क्लास को संदर्भित करने के लिए उपयोग की जाती है। जब स्टैटिक मेथड्स को कॉल किया जाता है, तो क्लास का नाम स्कोप रिज़ॉल्यूशन ऑपरेटर (::) के साथ जुड़ा होता है जबकि अन्य इंस्टेंस मेथड्स के मामले में हम उन्हें ऑब्जेक्ट के नाम का उपयोग करके कॉल करते हैं। static:: को उस क्लास का उपयोग करके हल नहीं किया जाएगा जिसमें मेथड परिभाषित है, बल्कि रनटाइम जानकारी का उपयोग करके गणना की जाएगी। वर्तमान क्लास के स्टैटिक संदर्भों को उस क्लास का उपयोग करके हल किया जाता है जिसमें फ़ंक्शन संबंधित है, न कि जहां इसे परिभाषित किया गया था।
उदाहरण
उदाहरण 1: self:: के साथ समस्या
निम्न कोड में, पैरेंट क्लास self:: प्रीफिक्स के साथ स्टैटिक मेथड कॉल करती है। वही मेथड जब चाइल्ड क्लास के साथ कॉल की जाती है तो चाइल्ड क्लास के नाम को संदर्भित नहीं करती क्योंकि यह हल नहीं होती।
<?php
class test1 {
public static $name = "Raja";
public static function name() {
echo "name of class: " . __CLASS__;
}
public static function getname() {
self::name();
}
}
class test2 extends test1 {
public static function name() {
echo "name of class: " . __CLASS__;
}
}
test2::getname();
?>
आउटपुट
name of class: test1
परिणाम दिखाता है कि अपेक्षा के विपरीत, पैरेंट क्लास का नाम लौटाया जाता है।
उदाहरण 2: static:: के साथ लेट बाइंडिंग
self:: के बजाय static:: का उपयोग रनटाइम पर लेट बाइंडिंग बनाता है:
<?php
class test1 {
public static function name() {
echo "name of class: " . __CLASS__;
}
public static function getname() {
static::name();
}
}
class test2 extends test1 {
public static function name() {
echo "name of class: " . __CLASS__;
}
}
test2::getname();
?>
आउटपुट
name of class: test2
उपरोक्त कोड अब अपेक्षा के अनुरूप चाइल्ड क्लास का नाम लौटाता है।
उदाहरण 3: नॉन-स्टैटिक संदर्भ में static:: का उपयोग
पैरेंट में प्राइवेट मेथड चाइल्ड में कॉपी हो जाता है, इसलिए इसका स्कोप अभी भी पैरेंट होगा।
<?php
class test1 {
private function name() {
echo "name of class: " . __CLASS__ . "\n";
}
public function getname() {
$this->name();
static::name();
}
}
class test2 extends test1 {
//
}
$t2 = new test2();
$t2->getname();
?>
आउटपुट
name of class: test1 name of class: test1
उदाहरण 4: पैरेंट मेथड ओवरराइड होने पर
हालांकि, जब पैरेंट मेथड ओवरराइड होता है, तो इसका स्कोप बदल जाता है।
class test3 extends test1 {
private function name() {
/* मूल मेथड रिप्लेस हो गया; name का स्कोप test3 है */
}
}
$t3 = new test3();
$t3->name();
आउटपुट
PHP Fatal error: Uncaught Error: Call to private method test3::name() from context ''