PHP tostring – PHP Magic Methods

PHP tostring - PHP Magic Methods

PHP tostring – PHP Magic Methods – PHP में जितने भी Methods की शुरूआत में Double Underscore का प्रयोग किया जाता है, वे सभी Magic Methods कहलाते हैं। उदाहरण के लिए __construct(), __destruct(), __call(), __callStatic, __get(), __set(), __isset(), __unset(), __clone(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() ये सभी PHP के Magic Methods हैं। हमने कुछ Magic Methods को पहले भी देखा है।

__toString() Method

ये Method या तो एक String Return करता है अथवा E_RECOVERABLE_ERROR Level का Fatal Error Return करता है। ये Method किसी Class को इस बात को तय करने की सुविधा देता है कि यदि उस Class के व्इरमबज को एक String की तरह Treat किया जाए, तो Object किस तरह से React करेगा।

उदाहरण के लिए यदि हम पिछले Program की अन्तिम Line को Uncomment कर दें और हम चाहें कि जब Time Class के किसी Object को Echo जैसे किसी Output Statement के साथ Use किया जाए, तो Object का Time Display होना चाहिए। ताकि हम Time Class के किसी Object के Time को Display करने के लिए हमेंशा Time Class के display() Method को Call करने से बच सकें, तो हम इस Class में __toString() Method को इस जरूरत को पूरा करने के लिए निम्नानुसार Override कर सकते हैं।

<?php
	class Time{
		private $hour, $minutes;
		
		public function __construct($hour=12, $minutes=0){
			$this->hour = $hour;
			$this->minutes = $minutes;
		}
		
		public function __toString(){
			return $this->hour .":" . $this->minutes;
		}
	}

	echo "Time: ";
	$hmt = new Time(10, 13);
	echo $hmt;
	
	$doSerial = serialize($hmt);
	echo "\n\nAfter Serialization of Time: \n";
	echo $doSerial;
	
	$sonata = new Time;
	$sonata = unserialize($doSerial);
	echo "\n\nAfter UnSerialization of Time: \n";
	echo $sonata
?>

अब ये Program Exactly वही Output दे रहा है, जो पिछला Program दे रहा था। लेकिन ये Program Time Type के Object को Echo Statement द्वारा Display कर रहा है, जबकि Current Program में हमने display() Method को __string() Method द्वारा Replace कर दिया है। परिणामस्वरूप हम Time Type के Object $hmt$sonata को Echo Statement के साथ भी Display कर पा रहे हैं।

__toString() Method Echo, Print, Printf जैसे किसी भी Output Statement के साथ काम करता है, लेकिन जब हम printf() Function के साथ इसे Use करना चाहते हैं, तब हमें Control String %s को Specify करना जरूरी होता है, जबकि किसी अन्य Control String जैसे कि %d के साथ ये Magic Method Automatically Execute नहीं होता।

__sleep() and __wakeup() Methods

ये दोनों Magic Methods किसी तरह का कोई Parameter Accept नहीं करते। लेकिन __sleep() Method Return Value के रूप में एक Array Return करता है जबकि __wakeup() Method कुछ भी Return नहीं करता।

जब हम serialize() Function को Use करते हैं, तब ये Function इस बात को Check करता है कि हमने हमारी Class में __sleep() Magic Method को Define किया है या नहीं। यदि हमने हमारी Class में __sleep() Method को Define किया हो, तो serialize() Method Execute होने से पहले __sleep() Method Execute होता है।

__sleep() Method का प्रयोग करके हम Serialization होने से पहले Serialize होने वाले Data को एक Array के रूप में Return करवा सकते हैं अथवा किसी भी ऐसे काम को पूरा कर सकते हैं, जिसे Serialization से पहले करवाना जरूरी होता है।

इस Method का प्रयोग करके हम किसी Object को Clean Up कर सकते हैं यानी Serialization से पहले Object के मानों में किसी तरह का परिवर्तन कर सकते हैं। अथवा Serialized होने वाले Object के Data Members को Variables के रूप में एक Array में Define करके उस Array को Return करवा सकते हैं।

यदि ये Method कुछ भी Return नहीं करता, तो NULL Serialized होता है और एक E_NOTICE Message Display होता है।

OOPS की Restrictions के कारण __sleep() Method भी Current Class की Parent Class के Object के Private Data Members को Return नहीं कर सकता। यदि हम ऐसा करने की कोशिश करते हैं, तो PHP E_NOTICEW Level का Error देता है। हालांकि इस तरह की जरूरत को पूरा करने के लिए हम Serializable Interface को Implement कर सकते हैं।

जिस तरह से serialize() Method से पहले __sleep() Method Execute होता है, उसी तरह से unserialize() Method के Execute होने से पहले __wakeup() Method Execute होता है। इसलिए Unserialization से पहले यदि हमें किसी काम को पूरा करना हो या किसी तरह का Cleanup काम करना हो, तो हम उस काम को __wakeup() Magic Method में Define करते हैं।

सामान्यतः __wakeup() Method का प्रयोग Database से Connection को Reestablish करने के लिए किया जाता है, क्योंकि सामान्यतः Serialization के दौरान Serialize करने के बाद Database Connection को Close कर दिया जाता है। इसलिए ये जरूरी होता है कि Unserialization के दौरान Database से फिर से Connection Establish हो। इसलिए __wakeup() Method में हम Database Connection Reestablish करने से सम्बंधित Codes लिखते हैं। इन दोनों Methods को Practically निम्नानुसार Use किया जाता हैः

<?php
class Connection
{
    protected $link;
    private $server, $username, $password, $db;
    
    public function __construct($server, $username, $password, $db)
    {
        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }
    
    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }
    
    public function __sleep()
    {
        return array('server', 'username', 'password', 'db');
    }
    
    public function __wakeup()
    {
        $this->connect();
    }
}
?>

हालांकि ये Program आपको अभी बिल्कुल भी समझ में नहीं आएगा क्योंकि अभी तक हमने Database के विषय में किसी तरह का कोई Discussion नहीं किया है। लेकिन जब हम Database के बारे में समझेंगे, तब आपको ये Program पूरी तरह से समझ में आ जाएगा, क्योंकि इस Program को हमें उस समय फिर से Use करना होगा, जब हम PHP को Database के साथ Use करते हुए Dynamic Web Site Create करने के बारे में जानेंगे।

__invoke() Method

ये भी एक Magic Method है और ये Method उस समय Automatically Call हो जाता है, जब हम अपने Program में किसी Class के Object को एक Function की तरह Call करने की कोशिश करते हैं। ये Method किसी भी तरह का मान Retune कर सकता है और Arguments के रूप में Variable Number of Parameters Accept कर सकता है। इस Method की Working को हम निम्न उदाहरण द्वारा आसानी से समझ सकते हैं:

<?php
	class Time{
		private $hour, $minutes;
		
		public function __construct($hour=12, $minutes=0){
			$this->hour = $hour;
			$this->minutes = $minutes;
		}
		
		public function __toString(){
			return $this->hour .":" . $this->minutes;
		}
		
		public function __invoke($hour, $minutes){
			$this->hour = $hour;
			$this->minutes = $minutes;
		}
	}

	echo "Time: ";
	$hmt = new Time();
	$hmt(2, 33);
	echo $hmt;
?>

इस Program में हमने $hmt Time Object को बिल्कुल अलग तरीके से Initialize किया है, जहां Constructor Call नहीं हो रहा है बल्कि __invoke() Magic Method Call हो रहा है।

सबसे पहले हमने $hmt नाम का एक Time Type का Object Create किया है, लेकिन इस Object को Constructor की Default Values से Initialize कर दिया है जो कि Hour=12 व Minutes=0 है। फिर हमने $hmt को निम्नानुसार Statement द्वारा इस तरह से Specify किया है, जैसे कि वह कोई Object नहीं बल्कि Standalone Function होः

$hmt(2, 33);

जब हम किसी Object को Function की तरह Call करते हैं, तो PHP उस Object के लिए __invoke() Magic Method को Call कर लेता है, परिणामस्वरूप इस Statement के लिए हमारी Class में Specify किया गया __invoke() Method Execute हो जाता है, जो $hmt Time Object के HourMinutes को क्रमश:  222 मानों से Fill कर देता है।

फिर इस Object के Time को Display करने के लिए हम Echo Statement का प्रयोग करते हैं। ये Statement Automatically __toString() Method को Call करता है और $hmt Time Object के HourMinutes का मान एक Time के रूप में Screen पर Display कर देता है।

__set_state() Method

जिस तरह से __toString() Method किसी Object को String Representation में Convert करता है, ताकि हम Object को Directly Echo या Print जैसे Statements द्वारा Display कर सकें, उसी तरह से ये Method किसी Object के Data Members को एक Array के रूप में Define करने की सुविधा देता है।

ये Method उस समय Automatically Invoke हो जाता है, जब हम किसी Object को var_export() Function में Argument के रूप में Pass करते हैं।

var_export() Function एक ऐसा Function है, जो Parseable PHP Code Return करता है। यानी इस Function से Return होने वाले Codes को हम सीधे ही eval() Function में Parameter के रूप में Pass कर सकते हैं और eval() Function उस Code को Parse करके Final Result Generate कर देता है। यानी ये Function Exactly var_dump() Function की तरह काम करता है, लेकिन इससे Return होने वाला Result Parseable PHP Code होता है।

यानी var_export() Function दूसरे Argument के रूप में एक Boolean मान Accept करता है। इस Boolean मान के रूप में यदि हम True Specify कर दें, तो ये Function अपने Argument Executable PHP Code Return करता है, जिसे सीधे ही eval() Function में Pass करके Interpret किया जा सकता है। लेकिन यदि हम दूसरा Parameter Specify नहीं करते हैं अथवा दूसरे Parameter के रूप में False Specify करते हैं, तो ये Function अपने Arguments की Values को String के रूप में Display कर देता है।

जब हम दूसरे Parameter में True Specify करते हैं, तब यदि हम var_export() Function द्वारा Return होने वाले Executable PHP Code को देखना चाहें, तो हमें Echo या Print Statement Use करना पडता है, जबकि दूसरे Parameter के रूप में False Specify करने पर अथवा कोई Parameter Specify न करने पर ये Function Automatically Current Object के Executable PHP Code को String Format में Display कर देता है। इसे समझने के लिए हम निम्न उदाहरण देखते हैं:

<?php
	class Time{
		private $hour, $minutes;
		
		public function __construct($hour=12, $minutes=0){
			$this->hour = $hour;
			$this->minutes = $minutes;
		}

		public static function __set_state($asArray){
			echo $asArray['hour'] . ':' . $asArray['minutes'];
		}
	}

	$hmt = new Time(3,50);
	var_export($hmt, true);

	echo "Time: "; 
	eval(var_export($hmt, true).";");
?>

इसी तरह से यदि हम हमारे उपरोक्त Statement को निम्नानुसार Modify कर दें:

echo var_export($hmt, true);

तब भी हमें उपरोक्त Output ही प्राप्त होता है। क्योंकि जब हम var_export() Function के दूसरे Argument में “true” Specify करते हैं, तब ये Function Executable PHP Code Return करता है, जिसे सीधे ही eval() Function में Specify करके Evaluate किया जा सकता है, जबकि इस स्थिति में ये Function Printable String Return नहीं करता।

इसलिए Return होने वाले Codes को Display करने के लिए हमें अलग से Echo या Print Statement का प्रयोग करना पडता है।

चलिए, अब हम हमारे __set_state() Magic Method को समझने की कोशिश करते हैं। उपरोक्त Program में हमने हमारे Magic Method को निम्नानुसार Specify किया हैः

Time::__set_state(array(
   'hour' => 3,
   'minutes' => 50,
))

Time: 3:50

जब हमारा ये Program Interpret होता है, तब निम्नानुसार Codes द्वारा सबसे पहले $hmt नाम का एक Time Type का Object Create होता है, जिसमें समय के रूप में 3:50 Specified रहता है।

		public static function __set_state($asArray){
			echo $asArray['hour'] . ':' . $asArray['minutes'] ;
		}

फिर इस Code का var_export() Method Execute होता है। चूंकि Nested Codes की Priority सबसे ज्यादा होती है, इसलिए eval() Function के Execution से पहले var_export() Function Execute होता है।

var_export() Function में हमने Time Class के $hmt Object को Argument के रूप में Pass किया है साथ ही इस Function के दूसरे Argument में हमने true Specify किया है, ताकि ये Function एक Executable PHP Code Return करे, जिसे eval() Function Execute कर सके।

चूंकि यदि हम var_export() Function में किसी Class के Object को Argument के रूप में Pass करें और दूसरे Parameter के रूप में “true” Specify करें तो यदि हमने हमारी Class में __set_state() नाम के Magic Method को Define किया हो, तो वह Method var_export() Method के Execute होते ही Execute हो जाता है।

चूंकि हमने var_export() Function में पहले Argument के रूप में एक Time Class का Object Pass किया है और दूसरे Argument के रूप में “true” भी Specify किया है साथ ही हमारी Time Class में हमने __set_state() Magic Method को भी Specify किया है, इसलिए जब ये Function Run होता है, तब PHP Automatically __set_state() Method को Call कर लेता है और var_export() Function में First Argument के रूप में Pass किए गए Object का एक Array Representation Create होता है।

इस Array Representation में Object की सभी Properties Array की Keys के रूप में Set हो जाती हैं और ये Array Parameter के रूप में __set_state() Method में Pass हो जाता है, जिसे इस Magic Method की Body में Use कर लिया जाता है।

चूंकि इस Method में Argument के रूप में जो Array आता है, वह Array वास्तव में एक Object का Array Representation होता है, इसलिए Object की Properties को इस Method की Boxy में Array की Keys के रूप में Specify करके Actual Object की Properties की Values को Access किया जा सकता है।

परिणामस्वरूप हमने हमारे इस Magic Method में Array की Keys के रूप में निम्नानुसार hourminutes को Keys के रूप में Specify करके $hmt Time Object के Time को Echo Statement द्वारा Display करने के लिए Statement लिखा है :

echo $asArray[‘hour’] . ‘:’ . $asArray[‘minutes’] ;

जब __set_state() Method Run होता है, तब उपरोक्त Code var_export() Function की Return Value के रूप में त्मजनतद होता है, जो eval() Function को Parameter के रूप में प्राप्त होता है और eval() Function इस Code को Execute कर देता है, जो कि Output में $hmt Object का Time Display कर देता है।

इस प्रकार से हम var_export() Function को __set_state() Method के साथ Use करके किसी Specific Type के PHP Code को Generate कर सकते हैं और उस Code को eval() Function में Parameter के रूप में Pass करके Parse कर सकते हैं।

What is Serialization in PHP
PHP instanceof | PHP Late Static Binding

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

PHP in Hindi | Page: 647 | Format: PDF

BUY NOW GET DEMO REVIEWS