परिचय
इनहेरिटेंस ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग पद्धति का एक महत्वपूर्ण सिद्धांत है। इस सिद्धांत का उपयोग करके दो क्लासेज के बीच संबंध परिभाषित किया जा सकता है। PHP अपने ऑब्जेक्ट मॉडल में इनहेरिटेंस का समर्थन करता है।
PHP दो क्लासेज के बीच संबंध स्थापित करने के लिए extends कीवर्ड का उपयोग करता है।
सिंटैक्स
class B extends A
जहां A बेस क्लास है (जिसे पैरेंट क्लास भी कहा जाता है) और B सबक्लास या चाइल्ड क्लास कहलाती है। चाइल्ड क्लास पैरेंट क्लास के public और protected मेथड्स इनहेरिट करती है। चाइल्ड क्लास इनहेरिट किए गए किसी भी मेथड को रीडिफाइन या ओवरराइड कर सकती है। यदि नहीं, तो इनहेरिटेड मेथड्स पैरेंट क्लास में परिभाषित उनकी कार्यक्षमता को बनाए रखते हैं, जब चाइल्ड क्लास के ऑब्जेक्ट के साथ उपयोग किए जाते हैं।
पैरेंट क्लास की परिभाषा चाइल्ड क्लास की परिभाषा से पहले होनी चाहिए। इस मामले में, क्लास A की परिभाषा स्क्रिप्ट में क्लास B की परिभाषा से पहले आनी चाहिए।
उदाहरण: बेसिक इनहेरिटेंस
<?php
class A {
// क्लास A की प्रॉपर्टीज़, कॉन्स्टेंट्स और मेथड्स
}
class B extends A {
// public और protected मेथड्स इनहेरिटेड
}
?>
यदि ऑटोलोडिंग सक्षम है, तो पैरेंट क्लास की परिभाषा क्लास स्क्रिप्ट लोड करके प्राप्त की जाती है।
इनहेरिटेंस उदाहरण: विजिबिलिटी
निम्न कोड दर्शाता है कि चाइल्ड क्लास पैरेंट क्लास के public और protected मेंबर्स को इनहेरिट करती है:
<?php
class parentclass {
public function publicmethod() {
echo "This is public method of parent class\n";
}
protected function protectedmethod() {
echo "This is protected method of parent class\n";
}
private function privatemethod() {
echo "This is private method of parent class\n";
}
}
class childclass extends parentclass {
public function childmethod() {
$this->protectedmethod();
//$this->privatemethod(); // यह त्रुटि उत्पन्न करेगा
}
}
$obj = new childclass();
$obj->publicmethod();
$obj->childmethod();
?>
आउटपुट
This is public method of parent class This is protected method of parent class PHP Fatal error: Uncaught Error: Call to private method parentclass::privatemethod() from context 'childclass'
नोट: Private मेथड्स चाइल्ड क्लास में इनहेरिट नहीं होते और एक्सेस नहीं किए जा सकते।
मेथड ओवरराइडिंग उदाहरण
यदि पैरेंट क्लास से इनहेरिट किया गया मेथड चाइल्ड क्लास में रीडिफाइन किया जाता है, तो नई परिभाषा पहले की कार्यक्षमता को ओवरराइड कर देती है।
<?php
class parentclass {
public function publicmethod() {
echo "This is public method of parent class\n";
}
protected function protectedmethod() {
echo "This is protected method of parent class\n";
}
private function privatemethod() {
echo "This is private method of parent class\n";
}
}
class childclass extends parentclass {
public function publicmethod() {
echo "public method of parent class is overridden in child class\n";
}
}
$obj = new childclass();
$obj->publicmethod();
?>
आउटपुट
public method of parent class is overridden in child class
हायरार्किकल इनहेरिटेंस
PHP मल्टीपल इनहेरिटेंस का समर्थन नहीं करता। इसलिए एक क्लास दो या अधिक क्लासेज को एक्सटेंड नहीं कर सकती। हालांकि, यह हायरार्किकल इनहेरिटेंस का समर्थन करता है:
<?php
class A {
function test() {
echo "method in A class";
}
}
class B extends A {
//
}
class C extends B {
//
}
$obj = new C();
$obj->test();
?>
आउटपुट
method in A class
महत्वपूर्ण नियम
- क्लास डेफिनिशन ऑर्डर: पैरेंट क्लास चाइल्ड से पहले परिभाषित होनी चाहिए (ऑटोलोडिंग के बिना)।
- केवल public और protected मेंबर्स इनहेरिट होते हैं।
- कंस्ट्रक्टर इनहेरिट होते हैं लेकिन चाइल्ड में नया कंस्ट्रक्टर परिभाषित करने पर पैरेंट का कंस्ट्रक्टर ऑटोमैटिकली नहीं चलता (parent::__construct() कॉल करना पड़ता है)।
- Final क्लासेज को एक्सटेंड नहीं किया जा सकता (अगले आर्टिकल देखें)।