PHP Namespace Tutorial

PHP Namespace Tutorial - Hindi

PHP Namespace Tutorial: Reusability की सुविधा प्राप्त करने के लिए हम हमारी जरूरत के अनुसार Classes, Interfaces, Constants या Functions की Library बनाते रहते हैं। ताकि हम हमारी जरूरत के अनुसार समान प्रकार के Codes को बार-बार लिखने से बच सकें और बिना Modify किए हुए इन Codes को Reuse कर सकें।

चूंकि Reusable Codes को Best तरीके से Maintain करने का तरीका यही है कि विभिन्न प्रकार के Reusable Codes को अलग-अलग Files के रूप में Save किया जाए। परिणामस्वरूप होता ये है कि हम हमारी अलग-अलग प्रकार की जरूरतों से संबंधित Classes, Interfaces, Constants या Functions को अलग-अलग Files में Store रखते हैं, इसलिए स्थिति ऐसी हो जाती है कि हमारी ज्यादातर Files में अलग-अलग प्रकार की जरूरतों को पूरा करने के लिए लिखी गई Classes, Interfaces, Constants या Functions के नाम समान होते हैं।

चूंकि किसी भी अन्य Programming Language की तरह हम PHP में भी समान Scope में समान नाम की Classes, Functions, Constants या Interfaces को Access नहीं कर सकते, क्योंकि समान नाम होने पर PHP इस बात का निर्णय लेने में अक्षम हो जाता है कि वास्तव में हम किस Class, Function, Constant या Interface के Codes को Access करना चाहते हैं।

परिणामस्वरूप जब हमारे सामने कोई ऐसा Project आता है जिसमें ऐसी Classes, Interfaces, Constants या Functions Use करने की जरूरत पडती है, जो कि हमारी बनाई हुई Library में पहले से ही उपलब्ध होती हैं, हम उन Library Classes, Interfaces, Constants या Functions को उपयोग में लेने में सक्षम नहीं हो पाते।

क्योंकि उन Library Classes, Interfaces, Constants या Functions से संबंधित Files को जब हम Reuse करने के लिए हमारे Current Program में Include करते हैं, ते Name Collision यानी समान नाम के एक से ज्यादा Functions, Interfaces, Classes या Constants की स्थिति पैदा हो जाती है। जिससे Reusable Codes होने के बावजूद हम हमारे Codes को Reuse नहीं कर पाते।

इस प्रकार की Name Collision की स्थिति से बचने के लिए PHP में Namespaces के Concept को Implement किया गया है। यानी Namespace Concept का प्रयोग करके हम हमारी विभिन्न Files में Create किए गए Codes को एक Particular नाम के साथ Combine कर देते हैं।

परिणामस्वरूप हर Class, Constant, Function या Interface की File किसी भी दूसरी अन्य File से अलग Identify होती है। इसलिए इन Files में समान नाम की Classes, Functions, Constants या Interfaces होने के बावजूद हम इन्हें किसी Project में एक साथ Include कर सकते हैं और इन Files के Codes को Reuse करते हुए Reusability की सुविधा प्राप्त कर सकते हैं।

यानी Namespaces के Concept को Use करते हुए हम जब हमारी Classes, Constants, Functions या Interfaces की Library Create कर रहे होते हैं, तो हम हमारी हर Class, Constant, Function या Interface को एक Unique Namespace से Bind कर देते हैं।

परिणामस्वरूप हम जब भी इन्हें Reuse करना चाहते हैं, हमें Namespaces को Specify करना पडता है और Namespaces को Specify करने की वजह से PHP समझ जाता है कि हम किस Namespace वाले Class, Constant, Function या Interface को Access करना चाहते है।

इस तरह से PHP अलग-अलग Files में समान नाम की Classes, Interfaces, Constants व Functions को Namespaces के कारण अलग-अलग Identify करता है और Name Collision की समस्या समाप्त हो जाती है।

Namespaces का प्रयोग करने के लिए हमें केवल इतना ही करना होता है कि जब हम हमारी Library Create कर रहे होते हैं, तब हमें हमारी Library File में केवल इतना ही Specify करना होता है कि हम हमारे Codes को किस नाम की Library से Associate करना चाहते हैं।

हम हमारी Library यानी हमारे Class, Function, Constant या Interface को जिस Namespace से Associate करते हैं, उस Library File के Codes को Reuse करते समय हम Namespace को Specify करके PHP को बताते हैं कि हम किस Namespace से Associated Library के Code को Access करना चाहते हैं। इस पूरी प्रक्रिया को समझने के लिए हम एक उदाहरण देखते हैं।

Namespace के Concept को यदि बिल्कुल ही सरल उदाहरण से समझें, तो हम हमारे Computer में बहुत सारे Folders Create कर सकते हैं और हर Folder में कई Files Create कर सकते हैं।

मानलो हमने हमारे Computer में Windows, Linux व Unix नाम के तीन Folder Crete किए। अब हम इन तीनों ही Folders में Hello.doc नाम की File Create कर सकते हैं। लेकिन किसी भी एक Folder में हम एक से ज्यादा Hello.doc नाम की File Create नहीं कर सकते। इस उदाहरण में Folders के नाम ही PHP के Namespaces हैं।

Creating Namespaces

Namespace Create करने के लिए हमें केवल namespace Keyword का प्रयोग करना होता है। हम जिस किसी भी Class, Function, Constant या Interface के Code को किसी Namespace से Associate करना चाहते हैं, हमें केवल उस Code की File के पहले Statement के रूप में इस Keyword के साथ अपने Namespace का नाम Specify करना होता है।

namespace Statement किसी भी Library File का पहला Statement होता है। इस Statement से पहले सिर्फ और सिर्फ declare Statement का प्रयोग किया जा सकता है। Declare Statement के अलावा Namespace Statement से पहले एक Space भी नहीं हो सकता, अन्यथा Error Trigger होता है।

हम एक से ज्यादा Files के Codes को समान Namespace से Associate करने के लिए एक से ज्यादा Files में समान Namespace को Specify कर सकते हैं।

उदाहरण के लिए मानलो कि हम Add नाम की एक Class बनाते हैं और उस Class में जोड करने के लिए Methods Define करते हैं और इस Class को हम MathAdd नाम के Namespace से Associate करना चाहते हैं। इस जरूरत को पूरा करने के लिए हम हमारा Code निम्नानुसार लिख सकते हैं:

//FileName: mathadd.inc.php
<?php
namespace MathAdd;
	class Add{
		public function total()
		{
			$i = 0; 
			$total = 0;
			
			while($i < func_num_args()){
				$total = $total + func_get_arg($i);
				$i++; 
			}	
			return $total;
		}
	}
?>

इस Program File में हमने सबसे पहले Statement के रूप में एक namespace MathAdd; को Specify किया है। परिणामस्वरूप mathadd.inc.php File में Defined Add नाम की Class अब MathAdd Namespace से Associated है, इसलिए यदि हम इस File को किसी PHP Script File में Include भी कर लें, तो भी हम इस Class को तब तक Access नहीं कर सकते, जब तक कि हम उस Script File में इस Namespace को फिर से Specify करके PHP को ये न बता दें, कि हम MathAdd नाम के Namespace से Associated Class को उपयोग में लेना चाहते हैं।

यदि मानलो कि हम इसी Namespace से Multiply नाम की एक Class को भी Associate करना चाहते हैं लेकिन ये Class multiply.inc.php नाम की File में लिखी गई है, तो इस जरूरत को पूरा करने के लिए भी हमें केवल multiply.inc.php File में First Statement के रूप में Namespace को Specify करना होगा। यानी हमारी multiply.inc.php File का Code निम्नानुसार ही होगा, जिसमें हमें केवल First Line को Namespace के साथ Modify करना होगाः

//FileName: multiply.inc.php
<?php
namespace MathAdd;
	class Multiply{
		public function multi()
		{
			$i = 0; 
			$multiply = 1;
			
			while($i < func_num_args()){
				$multiply = $multiply * func_get_arg($i);
				$i++; 
			}	
			return $multiply;
		}
	}
?>

इस प्रकार से हम जितनी चाहें उतनी Classes, Constants, Interfaces या Functions को इसी तरह से एक समान Namespace से Associate कर सकते हैं, फिर चाहे वे सभी समान File में हों Defined हों या अलग-अलग File में।

यदि हम उपरोक्त दोनों Classes को एक ही File द्वारा MathAdd Namespace से Associate करना चाहें, तो उस स्थिति में हमें केवल एक ही File बनानी होगी। एक File में हम जितने भी Codes लिखते हैं, वे सभी Codes उसी Namespace से Associated हो जाते हैं, जिसे हमने Current File के Top में First Statement के रूप में Specify किया होता है।

Sub-Namespace

जिस तरह से हम Namespaces को Specify करते हैं, उसी तरह से हम किसी Sub-Namespace के साथ भी किसी Code को Associate कर सकते है। उदाहरण के लिए मानलो कि उपरोक्त दोनों Codes को हम AddMultiply नाम के दो Sub-Namespaces से Associate करना चाहते हैं, जबकि ये दोनों ही Math नाम के Main Namespace से Associated होने चाहिए। इस जरूरत को हम निम्नानुसार पूरा कर सकते हैं:

//FileName: mathadd.inc.php
<?php
namespace Math\Add;
	class Add{
		public function total()
		{
			$i = 0; 
			$total = 0;
			
			while($i < func_num_args()){
				$total = $total + func_get_arg($i);
				$i++; 
			}	
			return $total;
		}
	}
?>

//FileName: multiply.inc.php
<?php
namespace Math\Multiply;
	class Multiply{
		public function multi()
		{
			$i = 0; 
			$multiply = 1;
			
			while($i < func_num_args()){
				$multiply = $multiply * func_get_arg($i);
				$i++; 
			}	
			return $multiply;
		}
	}
?>

जैसाकि उपरोक्त दोनों Codes के Namespace Declaration में हम देख सकते हैं कि Sub-Namespace Specify करने के लिए हमें Namespace में निम्नानुसार केवल एक Slash का प्रयोग करना होता है और हमारे Codes किसी Sub-Namespace से Associate हो जाते हैं:

Using Namespace

अब यदि हम उपरोक्त दोनों Classes को उपयोग में लेना चाहें तो हम इनके Namespace को Specify करते हुए इनकी Class Files को निम्नानुसार Current Script में Include कर सकते हैं:

<?php
namespace MathAdd;

include_once('mathadd.inc.php');
include_once('multiply.inc.php');
	
	$sum = new Add;
	Echo "\nTotal : " . $sum->total(10,30);
	
	$mul = new Multiply;
	Echo "\nMultiply : " . $mul->multi(10,30);
?>

// Output
   Total : 40
   Multiply : 300

यदि हम चाहें तो किसी Class को Fully Qualified Name द्वारा Directly Access कर सकते हैं। इस स्थिति में हमें Namespace को Current Script में Specify करने की जरूरत नहीं रहती है।

उदाहरण के लिए मानलो कि हमने Math\Add व Math\Multiply नाम के दो Sub-Namespaces Create किए हैं और दोनों Namespaces से दो Classes क्रमश:  AddMultiply Associated हैं। अब यदि हम इन दोनों Classes को बिना Namespace Use किए हुए Directly Access करना चाहें, तो हम इन Classes को निम्नानुसार Fully Qualified Name का प्रयोग करके Directly Access कर सकते हैं:

<?php
include_once('mathadd.inc.php');
include_once('multiply.inc.php');
	
	$sum = new \Math\Add\Add;
	Echo "\nTotal : " . $sum->total(10,30);
	
	$mul = new Math\Multiply\Multiply;
	Echo "\nMultiply : " . $mul->multi(10,30);
?>

जैसाकि उपरोक्त Program में हम देख सकते हैं कि हमने इस Program में किसी Namespace को Use नहीं किया है, फिर भी हम \Math\Add\Add नाम द्वारा Directly Add Class का तथा Math\Multiply\Multiply नाम द्वारा Directly Multiply Class का Object Create कर रहे हैं।

जब एक ही Namespace से एक से ज्यादा Classes Associated होती हैं, तो Namespace को केवल एक ही बार Specify करना होता है और अलग-अलग Classes को Access करने के लिए हमें Partial Qualified Name Use करना होता है। जैसेः

<?php
namespace Math;

include_once('mathadd.inc.php');
include_once('multiply.inc.php');
	
	$sum = new Add\Add;
	Echo "\nTotal : " . $sum->total(10,30);
	
	$mul = new Multiply\Multiply;
	Echo "\nMultiply : " . $mul->multi(10,30);
?>

उपरोक्त Program में हम ये मान रहे हैं कि हमारी AddMultiply Classes Math\AddMath\Multiply Sub-Namespaces से Associated हैं। इसलिए Add व Multiply Classes के Object Create करने के लिए हमने Add\Add तथा Multiply\Multiply Expressions को Use किया है क्योंकि Add नाम की Class Math Namespace के Add नाम के Sun-Namespace में है जबकि Multiply नाम की Class Math Namespace के Multiply नाम के Sun-Namespace में है।

जिस तरह से हम किसी Namespace में Available Class के Object Create करने के लिए उपरोक्त तरीकों को Use करते हुए Fully Qualified या Partial Qualified नामों को Specify करते हुए Classes को Access करते हैं, उसी तरह से किसी Namespace या Sub-Namespace से Associated Functions, Interfaces या Constants को भी Partial या Fully Qualified नामों का प्रयोग करके Access कर सकते हैं।

इसे समझने के लिए हम निम्नानुसार एक File Create कर सकते हैं, जिसमें एक Function व एक Constant Variable है, जिसे हम Current Script में Access करना चाहते हैं।

//FileName: mynamespace.inc.php
<?php
namespace MyNamespace;

	const PI = 3.14;
	function add($a, $b){
		return $a + $b;
	}
?>

इस Namespace File के FunctionConstant को हम निम्नानुसार अपनी Script File में Use कर सकते हैं:

<?php
namespace MyNamespace;

include_once('mynamespace.inc.php');

echo "Value of PI: " . PI . "\n";
echo "Addition of 10 and 20 : ". add(10, 20);
?>

चूंकि हमने हमारी सभी Accessible FunctionConstant को Directly MyNamespace से Bind किया था, इसलिए इस Namespace के सभी Codes हमारी Current Script में Directly Accessible हैं। परिणामस्वरूप हम हमारे इस Program में Constant PI व Function add() दोनों को Directly Access कर पा रहे हैं।

जबकि यदि हम हमारे Function व Constant को किसी Sub-Namespace से Bind करते, तो हमें पिछले उदाहरण के अनुसार Fully अथवा Partial Qualified नामों द्वारा इन्हें Access करना पडता। इस प्रक्रिया को समझने के लिए हम हमारी mynamespace.inc.php File को निम्नानुसार Modify करते हैं:

//FileName: mynamespace.inc.php
<?php
namespace MyNamespace\General;

	const PI = 3.14;
	function add($a, $b){
		return $a + $b;
	}
?>

यहां हमने MyNamespace में General नाम का एक Sub-Namespace Create करके अपनी mynamespace.inc.php File के Code को इस Sub-Namespace से Associate कर दिया है। परिणामस्वरूप अब यदि हम PI के मान या add() Function को Access करना चाहें, तो हमें हमारी Script File में इन्हें निम्नानुसार Use करना होगाः

<?php
namespace MyNamespace;

include_once('mynamespace.inc.php');

echo "Value of PI: " . General\PI . "\n";
echo "Addition of 10 and 20 : ". General\add(10, 20);
?>

जबकि यदि हम Namespace को Specify ही न करें, तो हमें PIadd() Functions को Access करने के लिए अपने उपरोक्त Program को निम्नानुसार Modify करते हुए Fully Qualified नामों को उपयोग में लेना होगाः

<?php
include_once('mynamespace.inc.php');

echo "Value of PI: " . MyNamespace\General\PI . "\n";
echo "Addition of 10 and 20 : ". MyNamespace\General\add(10, 20);
?>

किसी Global Function, Class, Interface या Constant जो कि किसी Namespace से Bound नहीं होते, को Access करने के लिए हम उस Function, Class, Interface या Constant के नाम के साथ केवल एक Slash Add करते हैं। जैसेः

<?php
include_once('mynamespace.inc.php');

function add($a, $b){
	return $a + $b + 10;
}

echo "Addition of 10 and 20 : ". MyNamespace\add(10, 20) . "\n";
echo "Addition of 10 and 20 : ". add(10, 20) . "\n";
echo "Addition of 10 and 20 : ". \add(10, 20) . "\n";
?>

इस Program में पहला Echo Statement Namespace के Add Function को Call कर रहा है, जबकि दूसरा व तीसरा Echo Statement Current Script में Specified add() Function को Call कर रहा है।

PHP Rules for Accessing Namespaces

जिस तरह से किसी File System में किसी File को Access करने के तीन तरीके होते हैं:

  • Relative File Name
  • Relative Path
  • Absolute Path

पहले तरीके से जब हम किसी File को Represent करते हैं तो Fine Name Current Directory को Refer करता है। उदाहरण के लिए यदि xyz.doc नाम की File Demo नाम की Directory में हो और हम हमारे Code में सीधे ही xyz.doc नाम को Specify करें, तो PHP उस File को Current Directory यानी Demo नाम की Directory में Search करेगा।

Relative Path के अन्तर्गत हम Directory के नाम के साथ File के नाम को Specify करते हैं। उदाहरण के लिए यदि हमारी Current Directory का नाम Demo है और उस Directory में PQR नाम की एक Subdirectory है, जिसमें xyz.doc नाम की File है, तो xyz.doc नाम की File को Current Directory से Refer करने के लिए हम इसे PQR/xyz.doc Relative Path से Refer करेंगे। यानी हमारा Relative Path Current Directory के Reference में Decide होगा।

Absolute Path के अन्तर्गत हम Root Directory यानी Drive Name से लेकर File के नाम तक का पूरा Path Specify करते हैं। जैस यदि हम “C:” Drive में हों, जहां Demo नाम का Folder हो और इसमें PQR नाम का Sub-Folder हो, जिसमें xyz.doc नाम की File हो, तो इस File को Access करने के लिए हमारा Path “C:\Demo\PQR\xyz.doc” होगा।

ठीक इसी तरह से PHP में हम किसी Namespace को भी इन्हीं तीन तरीकों से Specify करते हैं। जब हम हमारी Script में किसी Namespace को namespace Keyword का प्रयोग करते हुए Script की First Line के रूप में Directly Specify करते हैं, तो वास्तव में हम Current Namespace को Refer कर रहे होते हैं।

यदि हमारा कोई Code Global हो, यानी हमारा Code किसी Namespace से Associated न हो, तो हमारा वह Code Current Script में Directly Accessible होता है।

जबकि यदि हम हमारे Namespace के किसी Sub-Namespace को Specify करना चाहें, तो हमें हमारे Namespace को Current Directory तथा Sub-Namespace को Sub-Directory मानते हुए अपने Namespace को Refer करना होता है।

उदाहरण के लिए यदि Demo नाम का Namespace व SubDemo नाम का Sub-Namespace हो, जिसमें PI नाम का Constant Defined हो और हमने Demo नाम के Namespace को अपनी Current PHP Script में Specify कर लिया हो, तो इस Demo नाम के Namespace की SubDemo नाम के Sub-Namespace को Specify करने के लिए हमें केवल SubDemo\PI ही लिखना होगा, क्योंकि Demo हमारा Current Namespace है, इसलिए इसे ैचमबपलि करने की जरूरत नहीं है।

जबकि Absolute Path के अन्तर्गत हम हमारे किसी Namespace को Current Script में Include नहीं करते, बल्कि यदि हम पिछले उदाहरण के PI को Access करना चाहें, तो हम Demo\SubDemo\PI Expression द्वारा पूरा Namespace Path Specify करते हैं।

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

PHP in Hindi | Page: 647 | Format: PDF

BUY NOW GET DEMO REVIEWS