PHP Static Variable

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

PHP in Hindi | Page: 647 | Format: PDF

BUY NOW DOWNLOAD READ ONLINE

PHP Static Variable – कई बार हमें ऐसे Class Members Create करने की जरूरत पड जाती है, जो कि किसी Object से Related नहीं होते बल्कि Class से Related होते हैं।

उदाहरण के लिए मानलो कि हम ये जानना चाहते हैं कि किसी Specific समय पर किसी Class के कुल कितने Objects Create हुए हैं। या मानलो कि हम ये जानना चाहते हैं कि किसी Specific समय पर किसी Web Site पर कुल कितने Specific Users Online हैं।

इस प्रकार की जरूरतों को पूरा करने के लिए हमें Static Members Declare करने की जरूरत पडती है। Static Members ऐसे Members होते हैं, तो Object Level नहीं बल्कि Class Level होते हैं।

Static Data Members Create करने के लिए हमें Data Members के साथ static Keyword का प्रयोग करना होता है। इसे समझने के लिए हम एक नया Class बनाते जो कि निम्नानुसार है।

<?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++;
		}
	}
	
	$monitor = new Box(20, 30, 40);
	$cpu = new Box(300, 200, 100);
	
	echo "\n Total Objects: " . Box::$count;
?> 

//Output
Total Objects: 2

इस Program में हमने तीन नई बातें Involve की हैं। सबसे पहले हमने एक Static Data Member Create किया है। चूंकि Static Data Member, Object Level नहीं बल्कि Class Level होता है, इसलिए एक Static Variable Class के सभी Objects के लिए अन्य Properties की तरह अलग-अलग Create नहीं होता बल्कि पूरी Class के सभी Objects के लिए केवल एक ही बार Create होता है।

चूंकि Static Data Member पूरी Class के लिए Common होता है, जिसके मान को Class के सभी Objects समान रूप से Share कर सकते हैं, इसलिए किसी Static Variable को हम $this द्वारा Refer नहीं कर सकते, क्योंकि $this केवल उस Object को Refer करता है, जिसने Class के किसी Method को Call किया है और चूंकि Static Data Member, Object में Available ही नहीं होता, इसलिए इसे Access करने के लिए हम $this का प्रयोग नहीं कर सकते।

परिणाम स्वरूप हमने $self Keyword का प्रयोग किया है। ये Keyword Current Class को Refer करता है। यानी जिस Class में हम किसी Member Function को Define कर रहे हैं या उस Class में Current Class को Represent करने के लिए हम $self का प्रयोग करते हैं।

यानी $this Current Object को Represent करता है जबकि $self Current Class को Represent करता है और हम इन्हें एक दूसरे के स्थान पर उपयोग में नहीं ले सकते, क्योंकि $this Object Level होता है और $self Class Level होता है।

चूंकि हमारे इस Program में हमने $count Static Variable को Public Scope में रखा है, इसलिए इस Data Member को हम Class से बाहर भी Directly Access कर सकते हैं और Class के बाहर Directly Access करने के लिए हमें Static Variable के साथ Class के नाम व Scope Resolution Operator को Use करना होता है, जैसाकि उपरोक्त Program में हमने निम्न Line के Code द्वारा किया हैः

echo “\n Total Objects: ” . Box::$count;

हम देख सकते हैं कि उपरोक्त Program में हमने $monitor$cpu नाम के कुल दो Box Type के Object Create किए हैं, इसलिए दो Objects को Create करने के लिए __construct() Method यानी Constructor दो बार Run होता है। परिणामस्वरूप $count Data Member का मान दो बार Increment होता है और हमें Output में “Total Objects” की संख्‍या 2 प्राप्त होती है।

जिस तरह से हम Static Data Members Create करते हैं, जो कि Object Level नहीं बल्कि Class Level होता है, उसी तरह से हम Static Methods भी Create कर सकते हैं, जो कि Object Level नहीं बल्कि Class Level होते हैं।

Static Methods तभी Create करने चाहिए, जबकि Static Method किसी भी तरह से Class के किसी Object Level के Data को Change नहीं कर रहा हो। क्योंकि Static Methods यदि किसी Class के Object Level Data को Change या Modify करने की कोशिश करते हैं, तो Object Oriented Programming Concepts का मूल Purpose Violate होता है। यानी OOPS का मूल Concept कि हम पहले से बने हुए किसी भी Code को बिना Change किए हुए ज्यों का त्यों Reuse कर सकें व नई Functionalities को भी Add कर सकें।

Static Methods चूंकि Class Level होते हैं, इसलिए जब एक से ज्यादा Classes के बीच Data Communication करना होता है, तब हम Static Methods Define कर सकते हैं। अथवा जब हमें ऐसा Code Create करना होता है, जिसका Class के Object Level Data पर किसी प्रकार से कोई Direct Effect नहीं पडेगा, तब हमें Static Method Create करना चाहिए।

Static Method Create करने के लिए हमें केवल Function के साथ Prefix के रूप में ठीक उसी तरह से static Keyword का प्रयोग करना होता है, जिस तरह से Static Data Members Create करने के लिए करना होता है।

<?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 static function totalObjects(){
			echo "Total Objects of the Class : " . self::$count;
		}
	}
	
	$cpu = new Box(300, 200, 100);
	$monitor = new Box(20, 30, 40);
	
	Box::totalObjects();
	
?>

यहां हमने फिर से पिछले ही Program को Modify किया है और ये Program भी ठीक वैसा ही Result Return करता है, जैसा पिछला Program Return कर रहा है। यानी ये Program भी किसी Specific समय पर Box Class के कुल Create होने वाले Objects की संख्‍या Return करता है, लेकिन इस Program में हमने $count Data Member के साथ-साथ totalObjects() नाम के Method को भी Static रखा है।

दोनों के Static होने की वजह से हम इन दोनों Data Members को बिना Class का कोई भी Object Create किए हुए, Class के नाम व Scope Resolution Operator का प्रयोग करते हुए कहीं भी Directly Access कर सकते हैं।

Static Method को मूल रूप से तो इसीलिए Create किया जाता है ताकि हम Class के किसी Method को बिना उस Class का Object Create किए हुए Directly Call कर सकें। क्योंकि जब हम किसी Non-Static Method को Class से बाहर Class के नाम व Scope Resolution Operator का प्रयोग करके Directly Access करते हैं, तो PHP हमें एक Warning Message देता है। जबकि किसी Static Method को इस प्रकार से Call करने पर PHP किसी तरह का Warning Message नहीं देता।

इसलिए मूल रूप से जब किसी Class में कोई Static Data Member होता है और उस Static Data Member को Class के बाहर Access करना होता है, तो उस Static Data Member को Class से बाहर Access करने के लिए एक Static Method बनाया जाता है और इस Static Method में Class के Static Data Member को Access किया जाता है।

क्योंकि सामान्यतः Class के Data को Private रखा जाता है और Private Data Member को Class के बाहर Directly Access नहीं किया जा सकता। यदि Class के Static Data Member को Class के बाहर Directly Access करना हो, तो हमें उस Static Data Member को Public करना पडता है और यदि हम Class के Data Member को Public करते हैं, तो OOPS के Rules का Violation होता है जो कि उचित नहीं है।

क्योंकि OOPS का नियम कहता है कि Object के Data हमेंशा Class से Outer World के लिए Hidden रहने चाहिए। यानी Object के सारे Data Private रहने चाहिए और उन Data को Access करने के लिए Public Methods Create करने चाहिए।

चूंकि Static Data Member Object Level होता ही नहीं है, यानी Static Data Member Class के हर Object के लिए अलग-अलग नहीं होता बल्कि एक ऐसा Data Member होता है, जिसे Class के सभी Objects समान रूप से Share करते हैं, इसलिए इस Static Data Member को किसी Class के Object के किसी Member Method द्वारा तो Access नहीं किया जा सकता, क्योंकि Object के Member Methods केवल अपने Object Level Data Members को ही Access कर सकते हैं, किसी Class Level Static Data Member को नहीं।

तो अब केवल एक ही स्थिति बचती है कि हम एक ऐसा Method बनाए जो कि स्वयं भी Object Level नहीं बल्कि Class Level हो। जब हम Class Level Method Create करते हैं, तो एक Class Level Method किसी भी Class Level Data Member को Directly Access कर सकता है। परिणामस्वरूप OOPS के Rules का Violation नहीं होता।

चूंकि Class Level Method बनाने के लिए भी हमें static Keyword का प्रयोग करना पडता है, इसलिए किसी Method को Class Level बनाने के लिए भी हमें Method के नाम से पहले static Keyword का प्रयोग करना होता है।

यानी उपरोक्त Program में हमने totalObjects() नाम का जो Method Create किया है, वह Object Level नहीं बल्कि Class Level Method है। इसलिए ये Class Level Method $count नाम के Class Level Static Data Member को बिना किसी परेशानी के Directly Access व Manipulate कर सकता है।

उपरोक्त Program में हम देख सकते हैं कि totalObjects() नाम का Static Method Class के किसी भी Data Member की किसी भी Value को Modify नहीं कर रहा है। इसलिए totalObjects() एक उपयुक्त Static Method है।

जबकि यदि कोई Static Method किसी Object Level Data को Modify करने की कोशिश करे, तो उस Method को Static नहीं बल्कि Normal Member Method की तरह ही Create करना चाहिए। अन्यथा जब धीरे-धीरे Project बडा होने लगता है, तब उस Project को True OOPS के Rules के आधार पर Extend व Modify करना काफी मुश्किल हो जाता है।

PHP में हम किसी Class के Object के साथ उस Class में Specified Static Method को Member Method की तरह Call कर सकते हैं, लेकिन Class के किसी Member Method को Static Method की तरह Class के बाहर Call करने पर PHP Error Trigger करता है। यानी उपरोक्त Program में हम निम्न Statement लिख सकते हैं:

$cpu->totalObjects();

हालांकि totalObjects() एक Static Method है, फिर भी हम Box Class के Object $cpu के साथ Member Method की तरह उपरोक्त Statement के अनुसार totalObjects() को Call कर सकते हैं। लेकिन हम निम्न Statement का प्रयोग करते हुए किसी Member Method को Class के बाहर Static Method की तरह Use नहीं कर सकतेः

Box::display();

चूंकि display() एक Member Method है, इसलिए इसे एक Static Method की तरह Scope Resolution Operator के साथ Class के बाहर Call नहीं किया जा सकता। यदि हम ऐसा करते हैं, तो PHP Error Fire करता है।

PHP Destructor | Constructor in PHP
PHP Object Clone

******

ये पोस्‍ट Useful लगा हो, तो Like कर दीजिए।

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

PHP in Hindi | Page: 647 | Format: PDF

BUY NOW DOWNLOAD READ ONLINE

Download All Hindi EBooks

सभी हिन्दी EBooks C, C++, Java, C#, ASP.NET, Oracle, Data Structure, VB6, PHP, HTML5, JavaScript, jQuery, WordPress, etc... के DOWNLOAD LINKS प्राप्‍त करें, अपने EMail पर।

Register करके Login करें। इस Popup से छुटकारा पाएें।