PHP Object Clone

PHP Object Clone – PHP में सभी Objects वास्तव में Reference होते हैं। यानी जब हम कोई Object Create करते हैं, तब हम वास्तव में Object के Data Members व Methods के लिए Memory Allocate कर रहे होते हैं और Memory Allocation के बाद Object की Class के Constructor द्वारा उस Memory Location का एक Reference Return होता है, जिसे Object के Variable में Store किया जाता है। यानी जब हम निम्न Statement लिखते हैं:

$cpuCabinet = new Box();

तब वास्तव में Memory में तीन Memory Locations बनते हैं, जिनमें Object के Height, Width व Length के मान Store हो जाते हैं और इस Memory Location का Base Address Reference के रूप में $cpu नाम के Variable में Store हो जाता है, जिसे हम Object कहते हैं। इस प्रक्रिया को हम निम्न चित्र द्वारा बेहतर तरीके से समझ सकते हैं:

PHP Object Clone - Hindi

अब यदि हम निम्न Statement द्वारा एक नया Object Create करते हैं:

$hardDiskDrive = $cpuCabinet;

तो PHP एक नया Object Create नहीं करता, बल्कि निम्न चित्रानुसार समान Object की Memory Location का Address ही Create होने वाले नए Object में Store कर देता है।

PHP Object Clone - Hindi

यानी जिस Memory Location को cpuCabinet Refer कर रहा है उसी Memory Location को hardDiskDrive भी Refer कर रहा है। परिणामस्वरूप यदि हम इन दोनों Objects में से किसी भी Object की किसी एक Property को भी Change करते हैं, तो दूसरे Object की Property भी Automatically Change हो जाएगी। इस प्रक्रिया को हम निम्न Program द्वारा ज्यादा बेहतर तरीके से समझ सकते हैं:

<?php
	class Box
	{
		private $height;
		private $width;
		private $length;
		public static $count = 0;
		
		function __construct($height, $width = 0, $length = 0){
			$this->height = $height;
			$this->width = $width;
			$this->length = $length;
			
			self::$count++;
		}
		
		public function setData($height, $width, $length){
			$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(300, 200, 100);
	$hardDiskDrive = $cpuCabinet;
	
	Echo "\nCPU Cabinet: \n";
	$cpuCabinet->display() . "\n";
	
	Echo "\nCPU Hard Disk: \n"; 
	$hardDiskDrive->display() . "\n";
	
	$hardDiskDrive->setData(40, 50, 100);
	
	Echo "\nAfter changing values of hardDiskDrive Object: ";
	Echo "\nCPU Cabinet: \n";
	$cpuCabinet->display() . "\n";
	
	Echo "\nCPU Hard Disk: \n"; 
	$hardDiskDrive->display() . "\n";
?>  

//Output
      CPU Cabinet:
      Height: 300
      Width: 200
      Length: 100

   CPU Hard Disk:
      Height: 300
      Width: 200
      Length: 100

   After changing values of hardDiskDrive Object:
      CPU Cabinet:
      Height: 40
      Width: 50
      Length: 100

   CPU Hard Disk:
      Height: 40
      Width: 50
      Length: 100

उपरोक्त Program के Output में हम देख सकते हैं कि हमने सबसे पहले Box Type का एक Object cpuCabinet Create किया है और फिर उस Object की Exact Same Values का एक नया Object hardDiskDrive Create किया हैः

$cpuCabinet = new Box(300, 200, 100);
$hardDiskDrive = $cpuCabinet;

जब हम इन दोनों Objects की Properties को display() Method द्वारा Display करते हैं, तब हमें निम्न Output प्राप्त होता हैः

//Output
   CPU Cabinet:
   Height: 300
   Width: 200
   Length: 100

   CPU Hard Disk:
   Height: 300
   Width: 200
   Length: 100

हालांकि दोनों ही Objects में समान Values हैं, लेकिन इसका मतलब ये नहीं हैं कि दोनों ही Objects में ये Values अलग-अलग Memory Location पर हैं। क्योंकि जब हम निम्न Statement के setData() Method द्वारा hardDiskDrive Object की Height, Width व Length को Modify कर देते हैं:

$hardDiskDrive->setData(40, 50, 100);

तो cpuCabinet Object के Height, Width व Length के मान भी Automatically Change हो जाते हैं। इसका कारण ये है कि जब हमने hardDiskDrive को cpuCabinet का मान Assign करके नया Object Create किया था, तब वास्तव में hardDiskDrive के लिए एक नया Object Create नहीं हुआ था, जिसमें अलग से Height, Width व Length हो, बल्कि hardDiskDrive Object में केवल cpuCabinet Object का Reference ही Store हुआ था। परिणामस्वरूप ये दोनों ही Objects समान Memory Location को Refer कर रहे हैं और हमें निम्नानुसार Output प्राप्त हो रहा हैः

After changing values of hardDiskDrive Object:
CPU Cabinet:
Height: 40
Width: 50
Length: 100

CPU Hard Disk:
Height: 40
Width: 50
Length: 100

चूंकि PHP में सभी Objects By Default References होते हैं, इसलिए जब हम किसी एक Object की Values को किसी दूसरे Object में Assign करते हैं, तब वास्तव में हम Object की Values को नहीं बल्कि Object के Reference को Assign कर रहे होते हैं।

लेकिन कई बार ऐसी जरूरत होती है कि हमें एक ही प्रकार के दो अलग Objects की जरूरत होती है, जो कि समान Memory Locations को Share नहीं कर रहे होते हैं। इस स्थिति में यदि हम उपरोक्त Program के आधार पर ही किसी cpuCabinet Object की Values को ज्यों की त्यों दूसरे Object hardDiskDrive के लिए नए Data Members Create करके उन नए Data Members में Store करना चाहें, तो इस जरूरत को पूरा करने के लिए PHP हमें clone नाम का एक Keyword Provide करता है।

इस Keyword का प्रयोग करके हम किसी एक पहले से Created Object का Clone Object Create कर सकते हैं, जिसमें पहले वाले Object का Reference Store नहीं होता बल्कि एक नया Object Create होता है, जिसके स्वयं के Data Members होते हैं और clone Keyword उस Create होने वाले नए Object के Data Members में Current Object के Data Members की Values को One by One Store कर देता है।

परिणामस्वरूप किसी एक Object के किसी भी Data Member का मान Change करने पर दूसरे Object के Data Member के मान में किसी तरह का परिवर्तन नहीं होता।

किसी Object का Clone Create करने के लिए हम निम्नानुसार Statement का प्रयोग कर सकते हैं:

$hardDiskDrive = clone $cpuCabinet;

इस प्रक्रिया को हम उपरोक्त उदाहरण में ही निम्नानुसार परिवर्तन करके Output में होने वाले Changes को समझ सकते हैं:

<?php
	class Box
	{
		private $height;
		private $width;
		private $length;
		public static $count = 0;
		
		function __construct($height, $width = 0, $length = 0){
			$this->height = $height;
			$this->width = $width;
			$this->length = $length;
			
			self::$count++;
		}
		
		public function setData($height, $width, $length){
			$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(300, 200, 100);
	$hardDiskDrive = clone $cpuCabinet;
	
	Echo "\nCPU Cabinet: \n";
	$cpuCabinet->display() . "\n";
	
	Echo "\nCPU Hard Disk: \n"; 
	$hardDiskDrive->display() . "\n";
	
	$hardDiskDrive->setData(40, 50, 100);
	
	Echo "\nAfter changing values of hardDiskDrive Object: ";
	Echo "\nCPU Cabinet: \n";
	$cpuCabinet->display() . "\n";
	
	Echo "\nCPU Hard Disk: \n"; 
	$hardDiskDrive->display() . "\n";
?>  
 
//Output
CPU Cabinet:
Height: 300
Width: 200
Length: 100

CPU Hard Disk:
Height: 300
Width: 200
Length: 100

After changing values of hardDiskDrive Object:
CPU Cabinet:
Height: 300
Width: 200
Length: 100

CPU Hard Disk:
Height: 40
Width: 50
Length: 100

जब ये Program Run होता है, तब हम cpuCabinet नाम का Box Type का एक Object Create करते हैं और clone Keyword का प्रयोग करके hardDiskDrive नाम का एक नया Object Create करते हैं, जिसमें Exactly वही Values होती हैं, जो कि cpuCabinet में हैं, लेकिन ये दोनों ही Objects एक दूसरे के Clone होते हैं इसलिए दोनों अलग-अलग Memory Locations Occupy करते हैं।

परिणामस्वरूप अब जब हम setData() Method का प्रयोग करके hardDiskDrive Object के मानों को Change करते हैं, तब भी cpuCabinet Object के Data Members का मान Change नहीं होता।

PHP हमें __clone() नाम का एक Specific Method भी Provide करता है, जिसका प्रयोग करके हम Clone के रूप में Create होने नए Object के Attributes के मान में किसी तरह का परिवर्तन भी कर सकते हैं।

उदाहरण के लिए यदि हम चाहते हैं कि cpuCabinet Object के आधार पर जब नया Object hardDiskDrive बने, तो इस नए Object की Height, Width व Length तीनों का मान 0 हो जाए। इस जरूरत को पूरा करने के लिए हम __clone() Method को उपयोग में लेते हुए अपने पिछले Program को ही निम्नानुसार Modify कर सकते हैं:

<?php
	class Box
	{
		private $height;
		private $width;
		private $length;
		public static $count = 0;
		
		function __construct($height, $width = 0, $length = 0){
			$this->height = $height;
			$this->width = $width;
			$this->length = $length;
			
			self::$count++;
		}
		
		public function setData($height, $width, $length){
			$this->height = $height;
			$this->width = $width;
			$this->length = $length;
		}
		
		public function __clone()
		{
			$this->height = 0;
			$this->width = 0;
			$this->length = 0;
		}
				
		public function display(){
			echo "Height: ". $this->height . "\n";
			echo "Width: " . $this->width . "\n";
			echo "Length: " . $this->length . "\n";
		}
	}
	
	$cpuCabinet = new Box(300, 200, 100);
	$hardDiskDrive = clone $cpuCabinet;
	
	Echo "\nCPU Cabinet: \n";
	$cpuCabinet->display() . "\n";
	
	Echo "\nCPU Hard Disk: \n"; 
	$hardDiskDrive->display() . "\n";
?>  

//Output
CPU Cabinet:
Height: 300
Width: 200
Length: 100

CPU Hard Disk:
Height: 0
Width: 0
Length: 0

जैसाकि उपरोक्त Program के Output में हम देख सकते हैं कि cpuCabinet Object के आधार पर अब जो नया hardDiskDrive Object Create हो रहा है, उसके सभी Data Members का मान Automatically 0 Set हो गया है।

PHP Static Variable
PHP Overloading - __set, __get, __isset, __unset, __call, __callStatic

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

PHP in Hindi | Page: 647 | Format: PDF

BUY NOW GET DEMO REVIEWS