PHP Override Function – उदाहरण के लिए मानलो कि हम हमारी Derived Class में Volume तो Calculate करना चाहते हैं, लेकिन साथ ही हम उस Volume के Data को Derived Class में एक नया Data Member Create करके उसमें Store करके भी रखना चाहते हैं। यानी हम NewBox Class के Object में Height, Width व Length के अलावा एक और Data Member को Extend करना चाहते हैं।
इस जरूरत को पूरा करने के लिए हमें हमारी Derived NewBox Class में एक नया Data Member भी Create करना होगा और जब हम नया Data Member Create करेंगे, तो हमें उसे Private Scope में ही रखना होगा क्योंकि OOPS का Rule यही है कि किसी भी Class के Data Members Outer Access से पूरी तरह से सुरक्षित रहें, इसके लिए उनका Private होना जरूरी है।
लेकिन जब हम Derived Class में Create किए गए नए Data Member को Private रखेंगे, तो फिर हम Base Class के set() Method का प्रयोग करके इस नए Data Member को Value Initialize नहीं कर सकते, क्योंकि Base Class का set() Method केवल Base Class के ही Data Members Height, Width व Length को ही Value Set कर सकता है।
इसी तरह से हम Derived Class में Create किए गए नए Data Member के मान को Access करने के लिए भी हम Base Class के get() Method व Value को Display करने के लिए Base Class के display() Method को भी Use नहीं कर सकते, क्योंकि Base Class के get() व display() Methods केवल Base Class के ही Data Members Height, Width व Length की Values को Return या Display कर सकता है, क्योंकि Derived Class के Newly Created Data Members के बारे में ये Methods जानते ही नहीं हैं।
इन सभी प्रकार की परेशानियों को Solve करने के लिए अब हमें हमारी Derived Class को थोडा और Modify करना होगा और अपनी Derived Class में हमें हमारी Base Class के set(), get() व display() Method को Override करना होगा।
जब हम किसी Base Class में Defined किए गए Methods के समान नाम का Method Derived Class में Create करते हैं, तो इस प्रकार के Method को Overridden Method कहते हैं और समान नाम का Method Derived Class में Create करने की प्रक्रिया को Overriding कहते हैं।
हम हमारी नई प्रकार की जरूरत को पूरा करने के लिए निम्नानुसार अपनी Modified Class Create कर सकते हैं:
<?php class NewBox extends Box{ private $vol; public function volume(){ $this->vol = $this->get('height') * $this->get('width') * $this->get('length'); return $this->vol; } public function newdisplay(){ $this->display(); echo "\nVolume : ". $this->volume(); } } $cpuCabinet = new NewBox(); //Setting Values $cpuCabinet->set('height', 10); $cpuCabinet->set('width', 20); $cpuCabinet->set('length', 30); //Getting Values Echo "CPU Cabinet"; $cpuCabinet->newdisplay(); ?>
चूंकि हम चाहते हैं कि Object की Height, Width व Length के साथ ही उसका Volume भी Output में Display हो, इसके लिए हमने Derived Class में newdisplay() नाम का एक नया Method Create किया है और इस Method में Parent Class के display() Method को Call कर लिया है।
newdisplay() Method में Specified Echo Statement Volume को Display कर देता है जबकि Parent Class का display() Method Object की Height, Width व Length को Display कर देता है।
लेकिन हमारा ये Solution एक उपयुक्त Solution नहीं है क्योंकि यदि Project बडा होगा, तो बहुत सारी Classes होंगी। हर Class में बहुत सारे Methods होंगे और जब हम नई Class Derive करेंगे, तो फिर हम स्वयं भी कई नए Methods Create कर लेंगे। इस प्रकार से एक ही प्रकार के कामों को करने के लिए हमें अलग-अलग Methods के नामों को याद रखना पडेगा।
उदाहरण के लिए यदि हम अपने पिछले Code को ही देखें, तो जब हम Box Class का Object Create करेंगे, तो Box Class के Object की Properties को Display करने के लिए हमें display() Method Call करना होगा, जबकि NewBox Class का Object Create करने के लिए हमें newdisplay() नाम का Method Call करना होगा। यानी Display जैसे समान काम को करने के लिए भी हमें दो अलग-अलग Methods का नाम याद रखना होगा। इस प्रकार के बहुत सारे नामों को याद रखने की समस्या से बचने के लिए OOPS में Method Overloading की सुविधा प्रदान की गई है।
Method Overloading एक ऐसी प्रक्रिया है, जिसमें हम जिस नाम के Methods Base Class में होते हैं, उसी नाम के Methods Derived Class में भी Create कर लेते हैं और PHP Program के Run होते समय स्वयं ये तय करता है कि किसी Object के लिए किस Class का Method Call करना है।
यानी यदि Object Base Class का होता है, तो PHP स्वयं उस Object के लिए Base Class का Method Call करता है, जबकि Object के Derived Class का होने पर PHP उस Object के लिए Derived Class का Method Call करता है।
इस प्रकार से यदि हम हमारे उपरोक्त Code में Overriding के इस OOPS Concept को Apply करें तो हम हमारे Code को निम्नानुसार Modify करके display() व newdisplay() नाम के दो Methods बनाने की बजाय केवल एक ही Method Create करके भी अपनी जरूरत को पूरा कर सकते हैं:
<?php class NewBox extends Box{ private $vol; public function volume(){ $this->vol = $this->get('height') * $this->get('width') * $this->get('length'); return $this->vol; } public function display(){ $this->display(); echo "\nVolume : ". $this->volume(); } } $cpuCabinet = new NewBox(); //Setting Values $cpuCabinet->set('height', 10); $cpuCabinet->set('width', 20); $cpuCabinet->set('length', 30); //Getting Values Echo "CPU Cabinet"; $cpuCabinet->display(); ?>
हालांकि हमने उपरोक्त Code में OOPS के Method Overriding Concept को Implement कर लिया है व Parent Class व Derived Class दोनों ही Classes के Objects के Data को Display करने के लिए हमने display() नाम का Method Create कर लिया हैं। लेकिन ये Program एक उपयुक्त Output Generate नहीं करता बल्कि Error Trigger करता है। क्यों?
Functions के बारे में समझते समय हमने कहा था कि जब कोई Function फिर से स्वयं को ही Call करता है, तो इस प्रकार के Function को Recursive Function कहते हैं और हमारे इस उदाहरण Program के display() Method के Code में भी Recursion ही हो रहा है।
क्योंकि इस Code में जैसाकि हम निम्नानुसार देख सकते हैं कि हमने display() Method में फिर से display() Method को Call कर लिया गया है, जो कि एक Recursive प्रक्रिया है।
यानी जब ये display() Method cpuCabinet Object के लिए Call होता हैं, तो PHP NewBox Class के ही display() Method को Invoke करता है और display() Method की Body में प्रवेश करता है, जहां उसे फिर से display() Method मिल जाता है।
चूंकि NewBox Class में display() Method को Define किया गया है, इसलिए PHP Parent Box Class के display() Method को Call नहीं करता, बल्कि फिर से NewBox Class के ही display() Method को Call कर लेता है और ये प्रक्रिया लगातार Recursively चलने लगती है।
public function display(){ $this->display(); echo "\nVolume : ". $this->volume(); }
तो अब सवाल ये है कि हम Parent Class के Method को किस प्रकार से Call करें, क्योंकि PHP हमेंशा किसी भी Method को Invoke करते समय सबसे पहले उस Method को Current Scope में Search करता है। इसलिए यदि हम समान नाम से ही Parent व Child दोनों Class के display() Method को Call करें, तो Recursive Process चालू हो जाता है और यदि हम अलग-अलग नाम Specify करें, तो OOPS के Method Overriding की सुविधा हमें प्राप्त नहीं होती।
इस सवाल के जवाब के रूप में PHP हमें parent:: Expression Provide करता है। यानी हम Derived Class में parent Keyword के साथ Scope Resolution Operator का प्रयोग करके Derived Class में Base Class के Method को Call कर सकते हैं।
इस प्रकार से यदि अब हम उपरोक्त Program Code को फिर से Modify करें, तो हमें हमारा Program Code निम्नानुसार प्राप्त होगा, जिसमें एक Well Defined Overridden display() Method हैः
<?php class NewBox extends Box{ private $vol; public function volume(){ $this->vol = $this->get('height') * $this->get('width') * $this->get('length'); return $this->vol; } public function display(){ parent::display(); echo "\nVolume : ". $this->volume(); } } $cpuCabinet = new NewBox(); //Setting Values $cpuCabinet->set('height', 10); $cpuCabinet->set('width', 20); $cpuCabinet->set('length', 30); //Getting Values Echo "CPU Cabinet"; $cpuCabinet->display(); ?>
अब जब हम ये Program Run करते हैं तो cpuCabinet Object के लिए display() Method Call करने पर जब PHP Control Derived Class के display() Method की Body में प्रवेश करता है, तो वहां उसे parent::display() नाम का Method मिलता है, जो कि Box Class के display() Method को Represent करता है।
परिणाम स्वरूप cpuCabinet Object की Parent Class यानी Box Class का display() Method भी Call हो जाता है और हमें केवल एक ही नाम display() याद रखने की जरूरत होती है।
उपरोक्त Overridden प्रक्रिया के कारण जब हम Box Class के Object के लिए display() Method Call करते हैं, तब PHP स्वयं ही Box Class के Object के लिए Box Class का display() Method Execute करता है, जबकि जब हम NewBox Class के Object के लिए display() Method Call करते हैं, तो PHP Derived Class के Object के लिए Define किए गए display() Method को Call कर लेता है।
इस प्रकार से PHP स्वयं ही Run Time में ये तय करता है कि किस Object के लिए किस Display method को Call करना है, इसी प्रक्रिया को दूसरे शब्दों में हम Polymorphism भी कह सकते हैं।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook PHP in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
PHP in Hindi | Page: 647 | Format: PDF