PHP में **लेट स्टैटिक बाइंडिंग (Late Static Binding - LSB)** एक ऐसी सुविधा है जो विरासत (inheritance) में static:: कीवर्ड का उपयोग करके **रनटाइम पर** कॉल की गई क्लास को संदर्भित करने की अनुमति देती है, बजाय उस क्लास के जहां मेथड परिभाषित है।
समस्या: self:: का व्यवहार
self:: हमेशा उस क्लास को संदर्भित करता है जहां कोड **लिखा गया है** (कंपाइल-टाइम), न कि जिसे **कॉल किया गया है** (रनटाइम)।
उदाहरण: समस्या प्रदर्शन
<?php
class Student {
public static $my_name = 'Joe';
public static function getName() {
return "The name of the student is: " . self::$my_name;
}
public static function getAge() {
echo self::getName(); // self:: यहाँ Student को संदर्भित करता है
}
}
class Professor extends Student {
public static function getName() {
return "The name of the student is: " . self::$my_name . " and age is 24.";
}
}
Student::getAge(); // आउटपुट: The name of the student is: Joe
Professor::getAge(); // आउटपुट: The name of the student is: Joe (Professor का getName नहीं बुलाया गया!)
?>
समाधान: static:: (लेट स्टैटिक बाइंडिंग)
<?php
class Student {
public static $my_name = 'Joe';
public static function getName() {
return "The name of the student is: " . self::$my_name;
}
public static function getAge() {
echo static::getName(); // static:: रनटाइम क्लास को संदर्भित करता है
}
}
class Professor extends Student {
public static function getName() {
return "The name of the student is: " . self::$my_name . " and age is 24.";
}
}
Student::getAge(); // The name of the student is: Joe
Professor::getAge(); // The name of the student is: Joe and age is 24. (Professor::getName बुलाया गया!)
?>
मुख्य अंतर
| कीवर्ड | बाइंडिंग समय | संदर्भित करता है |
|---|---|---|
self:: | कंपाइल-टाइम (प्रारंभिक बाइंडिंग) | वह क्लास जहां मेथड परिभाषित है |
static:: | रनटाइम (लेट बाइंडिंग) | वह क्लास जिसे वास्तव में कॉल किया गया |
$this-> | रनटाइम | वर्तमान ऑब्जेक्ट इंस्टेंस (नॉन-स्टैटिक) |
अन्य उपयोग: static:: प्रॉपर्टीज़ के लिए
<?php
class A {
public static $val = 'A';
public static function show() {
echo static::$val; // लेट स्टैटिक बाइंडिंग प्रॉपर्टी पर भी लागू
}
}
class B extends A {
public static $val = 'B';
}
A::show(); // A
B::show(); // B
?>
महत्वपूर्ण नोट्स
- PHP 5.3.0+ में उपलब्ध।
static::केवल स्टैटिक संदर्भ में काम करता है (स्टैटिक मेथड/प्रॉपर्टी)।get_called_class()फ़ंक्शन कॉल की गई क्लास का नाम स्ट्रिंग के रूप में लौटाता है।- फैक्ट्री पैटर्न, एक्टिव रिकॉर्ड, ORM बेस क्लासेस में व्यापक रूप से उपयोगी।