PHP Overloading – __set, __get, __isset, __unset, __call, __callStatic

PHP Overloading – PHP में भी हम Overloading कर सकते हैं लेकिन PHP की Overloading अन्य Programming Languages की Overloading से भिन्न होती है। PHP में हम किसी भी Function अथवा Operator का Overload नहीं कर सकते, बल्कि PHP में Overloading का मतलब किसी Object की PropertiesMethods को Dynamically यानी Script के Run Time में Create करना होता है।

PHP हमें कुछ निश्चित Functions Provide करता है, जिन्हें हम हमारी जरूरत के अनुसार Overload कर सकते हैं, यानी उन्हें किसी Special काम को पूरा करने के लिए Program कर सकते हैं।

ये Overloaded Methods उस समय Automatically Invoke हो जाते हैं, जब हम किसी ऐसी Property या Method को Access करने की कोशिश करते हैं, जो कि Declare नहीं किए गए हैं अथवा जो कि Current Scope में Visible नहीं हैं।

PHP में हमें सभी Overloading Methods को public Scope में Define करना जरूरी होता है।

PHP में हम कुल चार Functions हैं, जो कि Class की Properties से संबंधित होते हैं, जिन्हें Overload किया जा सकता है। ये Functions निम्नानुसार हैं:

public void __set ( string $name , mixed $value )
public mixed __get ( string $name )
public bool __isset ( string $name )
public void __unset ( string $name )

__set() Method

ये Method तब Run होता है, जब हम किसी Object की ऐसी Property को Access करने की कोशिश करते हैं, जो कि या तो Object के लिए Visible नहीं होता या फिर Object की Class में उस Property को Declare नहीं किया गया होता।

जब ये Method Call होता है, तब ये Method Object के लिए पहले Argument के रूप में Specify किए गए String के नाम की एक नई Property Create करता है और दूसरे Argument के रूप में Specified Value को पहले Argument के रूप में Create होने वाली Property में Store कर देता है।

इस Function की Overloading को हम निम्न Program द्वारा आसानी से समझ सकते हैं:

<?php
	class Box
	{
		public function __set($property, $value){
			$this->$property = $value+1;
		}
		function __construct($height, $width = 0, $length = 0){
			$this->height = $height;
			$this->width = $width;
			$this->length = $length;
		}
		
		public function display(){
			echo "Height: ". $this->height . "\n";
			echo "Width: " . $this->width . "\n";
			echo "Length: " . $this->length . "\n";
		}
	}
	
	$cpuCabinet = new Box(10,20,30);
	Echo "CPU Cabinet Properties : \n";
	$cpuCabinet->display();
?>

//Output
   CPU Cabinet Properties : 
   Height: 11
   Width: 21
   Length: 31

उपरोक्त Program में हमने जब cpuCabinet Object Create किया, तब उसमें हमने Height, Width व Length के रूप में 10, 20 व 30 मान Initialize किए। इन मानों को cpuCabinet Object की Height, Width व Length Properties में Set करने के लिए Box Class का ब्वदेजतनबजवत ब्ंसस होता है।

चूंकि हमने हमारी Class में एक भी Data Member को Declare नहीं किया है, परिणाम स्वरूप ये सभी Data Members Automatically Run Time में Create होते हैं और इनके Create होते समय __set() Method Automatically Call हो जाता है।

यानी जैसे ही कोई ऐसा Data Member Create होता है, जो कि पहले से Class में Available नहीं है, __set() Method Automatically Call हो जाता है। जब ये __set() Method Call होता है, तो Object की विभिन्न Properties इस Method के First Argument के रूप में Set हो जाती हैं, जबकि Method के दूसरे Argument के रूप में वो Value होती है, जिसे हम Object Create करते समय Object के Constructor में Pass करते हैं और ये Value Create होने वाली नई Properties में Initialize हो जाती हैं।

यानी जब cpuCabinet Object Create होता है, तब इस Object की विभिन्न Properties को Set करने के लिए हम इस Object के Constructor को तीन मान 10, 20 व 30 Set करते हैं।

चूंकि Class में एक भी Data Member पहले से Created नहीं है, इसलिए Constructor के Call होते ही Constructor में Specify किए गए तीनों Data Members ($this->height, $this->width, $this->length) Create होना शुरू होते हैं। जैसे ही ये Data Members Create होना शुरू होते हैं, हर Data Member के Creation के समय ही __set() Method Call हो जाता है, क्योंकि इन्हें Dynamically Create करने का काम __set() Method ही करता है।

यानी $this->height Data Member को Create करने के लिए __set() Method Call होता है, फिर $this->width Data Member को Create करने के लिए __set() Method के Call होता है और अन्त में $this->length Data Member को Create करने के लिए भी __set() Method Call होता है।

यानी हर Data Member को Create करने के लिए __set() Method Call होता है। जब __set() Method Call होता है, तब Constructor में Specify किए गए हर Data Member का नाम यानी “$this->” के बाद Specify किया गया हर नाम Dynamically Create होने वाले नए Data Member का नाम बन जाता है, इसलिए ये नाम __set() Method में First Argument के रूप में Set हो जाता है।

जबकि Constructor में Parameters के रूप में आने वाले विभिन्न मान इन Dynamically Create होने वाले Data Members में Value के रूप में Set हो सकें, इसके लिए __set() Method के दूसरे Arguments के रूप में ये Arguments Specify हो जाते हैं।

इस प्रक्रिया को यदि हम हमारे Program के आधार पर समझें तो जब cpuCabinet के लिए Constructor Call होता है, तब सबसे पहले Current Object यानी $this-> के लिए Height नाम का Data Member Create होता है।

इस Data Member को Create करने के लिए __set() नाम का Method Execute होता है और $this->height Expression से height नाम इस __set() नाम के Method में पहले Parameter के रूप में Pass हो जाता है, जबकि Constructor में Value के रूप में आने वाला मान, जो कि $height नाम के Variable में होता है, __set() Function के दूसरे Argument के रूप में पहुंच जाता है। इस प्रकार से इस __set() Function में निम्नानुसार दो Parameters Pass हो जाते हैं:

__set(“height”, $height);

यानी

__set($property, $value);

यानी इस Method के $property Parameter में नाम “height” Store हो जाता है, जबकि दूसरे Parameter $value में Constructor के Variable $height का मान 10 Set हो जाता है।

अब PHP Control इस Method की Body में Enter करता है और $this->height नाम का एक नया Data Member Create करता है, जिसमें Value के रूप में $height का मान 10 जो कि $value नाम के Argument में है, से Set कर देता है। इस पूरी प्रक्रिया को हम निम्न चित्र द्वारा ज्यादा बेहतर तरीके से समझ सकते हैं।

PHP Overloading - Hindi

चूंकि हर Data Member के लिए __set() Method Call होता है, इसलिए हर बार ये Method Argument के रूप में Constructor से आने वाले मान में 1 जोडने के बाद उस Modified मान को Dynamically Create होने वाले Data Member में Store करता है।

इसीलिए जब हम cpuCabinet Object के Data को display() Method द्वारा Display करते हैं, तो हमें Output में 10, 20, 30 के स्थान पर 11, 21, 31 दिखाई देते हैं।

उपरोक्त उदाहरण में हमने Box Class के Constructor में तीन Arguments Specify किए है, इसलिए जब हम इस Class का Object Create करते हैं, तब हमें तीन Arguments Parameters के रूप में Pass करने पडते हैं। लेकिन यदि हम कोई ऐसी Class Create करें, जिसमें Constructor के रूप में एक भी Parameter Pass न किया गया हो, तो हम किसी Object के लिए उसकी Properties को एक अन्य तरीके से भी Dynamically Create कर सकते हैं। इसे समझने के लिए हम एक और उदाहरण देखते हैं।

<?php
	class Box
	{
		public function __set($property, $value){
			$this->$property = $value+1;
		}
	}

	$cpuCabinet = new Box();
	$cpuCabinet->height = 10;
	$cpuCabinet->width = 20;
	$cpuCabinet->length = 30;
	
	echo "Height of CPU Cabinet : " . $cpuCabinet->height . "\n";
	echo "Width of CPU Cabinet : " . $cpuCabinet->width . "\n";
	echo "Length of CPU Cabinet : " . $cpuCabinet->length . "\n";
?>  

//Output
   Height of CPU Cabinet : 11
   Width of CPU Cabinet : 21 
   Length of CPU Cabinet : 31

इस Program में भी Exactly वैसी ही प्रक्रिया हो रही है, जैसी पिछले Program में हो रही थी। यानी इस Program में भी Dynamically ही विभिन्न Height, Width व Length नाम के विभिन्न Data Members Dynamically ही Create हो रहे हैं और इन्हें Create करने का काम भी __set() Method ही कर रहा है।

चूंकि इस Program में हमने Box Class में एक भी Data Member Create नहीं किया है, इसलिए जब हम Box Type का एक cpuCabinet Object Create करते हैं और उसकी height, widthlength Property को Values Set करने की कोशिश करते हैं, तो इन Properties के Class में उपलब्ध न होने के कारण __set() Method Execute होता है और क्रमश:  height, width व length Properties को __set() Method में पहले Argument में तथा क्रमश:  10, 20 व 30 को दूसरे Argument के रूप में Accept करता है।

फिर पहले Argument के रूप में आने वाले नाम की एक Property Create करता है और दूसरे Argument के रूप में आने वाले मान को उस Dynamically Create की गई property में Store कर देता है। इस प्रकार से ये तीनों Properties __set() Method का प्रयोग करते हुए Dynamically Create होती हैं।

यदि हम __set() Method को Define न करें, तब भी Dynamically Data Members Create करने का काम __set() Method ही करता है। लेकिन जब हम इस Method को Define करते हैं, तब हम Create होने वाले Data Member में Store होने वाले मान को अपनी इच्छानुसार Modify करके Store कर सकते हैं, जैसाकि उपरोक्त Program में हमने Input के रूप में आने वाले मान 10, 20 व 30 को एक बढाकर 11, 21, व 31 कर दिया है।

__get() Method

ये Method भी उस समय Automatically Call होता है जब हम किसी Class के किसी Object की किसी ऐसी Property को Access करने की कोशिश करते हैं, जो कि Class में Available ही नहीं है। इस Method को Overload करके हम इस प्रकार की स्थिति को Handle करते हैं। इस Method को हम निम्नानुसार उपयोग में ले सकते हैं:

<?php
	class Box
	{
		public function __set($property, $value){
			$this->$property = $value+1;
		}
		
		public function __get($property){
			echo "$property Attribute is not available. ";
		}
	}

	$cpuCabinet = new Box();
	echo "Volume : " . $cpuCabinet->height;
?>

इस Program में हम cpuCabinet Object के लिए height नाम की एक Property को Print करने की कोशिश कर रहे हैं, जबकि ये Property हमारी Box Class में हमने Define ही नहीं की है। इस स्थिति में __get() Method Automatically Run होता है और height नाम इस Method के First Argument में पहुंच जाता है। परिणामस्वरूप ये Program निम्न Output देता है-

height Attribute is not available.

__get() व __set() Methods केवल Object Scope में ही काम करते हैं। सामान्यतः विभिन्न Overloading Methods को PHP में Magic Methods भी कहा जाता है। ये Magic Methods Object Level पर ही Execute होते हैं। यदि हम इन्हें Class Level यानी किसी Static Context में Use करें, तो ये Trigger नहीं होते।

सामान्य रूप से देखा जाए तो __set() व __get() ये दोनों ही Methods हमारे लिए कोई विशेष उपयोगी नहीं हैं। लेकिन हम इन Methods को किसी Object के लिए Manually भी Call कर सकते हैं।

जब हम __get() Method को Manually Call करते हैं, तब Argument के रूप में हम इसमें उस Property का नाम String के रूप में Specify कर सकते हैं, जिसकी Value को हम Return करवाना चाहते हैं।

लेकिन चूंकि ये दोनों ही Methods Automatically भी Call हो जाते हैं, इसलिए हम इन Methods को Overload करने के बजाय अपने स्वयं के get()set() Method Create कर सकते हैं। जहां set() Method हमारे किसी Object के विभिन्न Attributes को Value Set करता है जबकि get() Method किसी Attribute की Value को Return करता है। जैसेः

<?php
	class Box
	{
		private $height, $width, $length;
		
		public function set($property, $value){
			$this->$property = $value;
		}
		
		public function get($property){
			return $this->$property;
		}
	}

	$cpuCabinet = new Box();
	
	//Setting Values
	$cpuCabinet->set('height', 10);
	$cpuCabinet->set('width', 20);
	$cpuCabinet->set('length', 30);
	
	//Getting Values
	Echo "CPU Cabinet";
	Echo "\n Height: ". $cpuCabinet->get('height');
	Echo "\n Width: ". $cpuCabinet->get('width');
	Echo "\n Length: ". $cpuCabinet->get('length');
?>

इस Program में Specify किए गए get()set() Methods Exactly वही काम करते हैं, जो हम चाहते हैं। यानी set() Method दो Arguments Accept करता है। पहला Argument Class की उस Property का नाम होता है, जिसमें Value Set करनी है जबकि दूसरी Property में वह मान होता है, जिसे पहले Argument वाली Property में Set करना है।

इसी तरह से get() Method केवल एक Argument लेता है, जिसमें उस Property का नाम होता है, जिसकी Value को Return करना है। परिणामस्वरूप जब ये Program Run होता है, तब हमें निम्न Output प्राप्त होता हैः

//Output
CPU Cabinet
Height: 10
Width: 20
Length: 30

__isset() Method

जब हम किसी Property के किसी Value से Set होने की स्थिति को Check करने के लिए isset() या empty() Method को Call करते हैं, तो ये Method Automatically Execute हो जाता है। इसलिए किसी Property या Method के Current Class में Defined न होने की स्थिति में इस Method को Overload किया जा सकता है और किसी Specific Type की जरूरत को पूरा किया जा सकता है।

उदाहरण के लिए मानलो कि यदि किसी Object की Properties को Set किए बिना ही जब हम उस Object की Property को Access करने की कोशिश करते हैं, तो ये Method Automatically Execute हो जाता है।

__unset() Method

जब हम किसी Property को Unset करने के लिए unset() Function Call करते हैं, तो ये Method Automatically Execute हो जाता है। इसलिए किसी Property या Method के Unset होने की स्थिति में इस Method को Overload किया जा सकता है और किसी Specific Type की जरूरत को पूरा किया जा सकता है।

PHP में कुल दो ऐसे Functions है, जो कि Class के Methods से संबंधित होते हैं, जिन्हें Overload किया जा सकता है। ये Functions निम्नानुसार हैं:

public mixed __call ( string $name , array $arguments )
public static mixed __callStatic ( string $name , array $arguments )

__call() Method and __callStatic() Method

__call() Method उस स्थिति में Automatically Execute हो जाता है, जब हम किसी Object के साथ किसी ऐसे Method को Invoke करने की कोशिश करते हैं, जो कि Class में Exist नहीं होता है या जिसे हमने पहले से Class में Define नहीं किया होता है। ये Method भी केवल Object Context में ही Execute हो सकता है।

जबकि __callStatic Method उस स्थिति में Automatically Execute हो जाता है जब हम किसी ऐसे Method को Static Context में Invoke करने की कोशिश करते हैं, जो कि Class में Exist नहीं होता।

ये दोनों ही Methods दो Arguments लेते हैं। पहले Argument के रूप में उस Method के नाम को Accept करते हैं, जो Exist न होने की स्थिति में भी Invoke किया जा रहा है जबकि दूसरा Argument एक Array होता है, जिसमें वे Parameters होते हैं, जिसे उस Undefined Method में Argument के रूप में Pass किया जा रहा है।

<?php
	class MethodTest
	{
	    public function __call($name, $arguments)
	    {
	        // Note: value of $name is case sensitive.
	        echo "Calling object method '$name' \n";
	    }
	
	    public static function __callStatic($name, $arguments)
	    {
	      echo "Calling static method '$name' \n";
	    }
	}
	
	$obj = new MethodTest;
	$obj->runTest('in object context');
	
	MethodTest::runTest('in static context');  
?>

उपरोक्त Program Code में __call()__callStatic() दोनों Methods को Overload किया गया है। चूंकि इस Program में हमने runTest() नाम का कोई Method Create नहीं किया है, इसलिए जब हम $obj के साथ Object Level पर runTest() Method को Call करते हैं, तो Automatically __call() Method Execute हो जाता है जबकि Class Level पर इस Method को Call करने पर __callStatic() Method Call हो जाता है और दोनों ही Methods के Call होने पर हमें निम्नानुसार Output प्राप्त होता हैः

//Output:
Calling object method ‘runTest’
Calling static method ‘runTest’

PHP in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook PHP in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

PHP in Hindi | Page: 647 | Format: PDF

BUY NOW GET DEMO REVIEWS