नाम स्थान क्या हैं?


241

PHP Namespaces क्या हैं?

सामान्य रूप से Namespaces क्या हैं?

उदाहरण के साथ एक आम आदमी का जवाब बहुत अच्छा होगा।

जवाबों:


573

नामकरण कार्य और वर्गों के लिए करता है जो चर के लिए गुंजाइश है। यह आपको एक ही कार्य या वर्ग के नाम का उपयोग एक ही कार्यक्रम के विभिन्न हिस्सों में नाम टकराव पैदा किए बिना करने की अनुमति देता है।

सरल शब्दों में, किसी व्यक्ति के उपनाम के रूप में एक नामस्थान के बारे में सोचें । यदि "जॉन" नाम के दो लोग हैं, तो आप उनके उपनामों का उपयोग उन्हें अलग बताने के लिए कर सकते हैं।

परिदृश्य

मान लीजिए कि आप एक एप्लिकेशन लिखते हैं जो एक फ़ंक्शन का उपयोग करता है जिसका नाम है output()। आपका output()फ़ंक्शन आपके पृष्ठ पर सभी HTML कोड लेता है और उपयोगकर्ता को भेजता है।

बाद में आपके एप्लिकेशन बड़े हो जाते हैं और आप नई सुविधाएँ जोड़ना चाहते हैं। आप एक पुस्तकालय जोड़ते हैं जो आपको RSS फ़ीड बनाने की अनुमति देता है। यह लाइब्रेरी output()अंतिम फ़ीड को आउटपुट करने के लिए एक फ़ंक्शन का भी उपयोग करती है ।

जब आप कॉल करते हैं output(), तो PHP को कैसे पता चलता है कि आपके output()फ़ंक्शन या आरएसएस लाइब्रेरी के output()फ़ंक्शन का उपयोग करना है या नहीं ? यह नहीं है जब तक आप नाम स्थान का उपयोग नहीं कर रहे हैं।

उदाहरण

हम दो output()कार्यों को कैसे हल करते हैं? सरल। हम प्रत्येक output()फ़ंक्शन को अपने स्वयं के नामस्थान में चिपकाते हैं

यह कुछ इस तरह दिखेगा:

namespace MyProject;

function output() {
    # Output HTML page
    echo 'HTML!';
}

namespace RSSLibrary;

function output(){
    # Output RSS feed
    echo 'RSS!';
}

बाद में जब हम विभिन्न कार्यों का उपयोग करना चाहते हैं, तो हम उपयोग करेंगे:

\MyProject\output();
\RSSLibrary\output();

या हम घोषणा कर सकते हैं कि हम नामस्थानों में से एक हैं और फिर हम सिर्फ उस नामस्थान को कॉल कर सकते हैं output():

namespace MyProject;

output(); # Output HTML page
\RSSLibrary\output();

कोई नामस्थान नहीं?

यदि हमारे पास कोई भी नाम नहीं है, तो (संभावित) कोड को बहुत बार बदलने के लिए, जब भी हम एक पुस्तकालय जोड़ते हैं, या अपने फ़ंक्शन नामों को अद्वितीय बनाने के लिए थकाऊ उपसर्गों के साथ आते हैं। नामस्थानों के साथ, हम अपने स्वयं के प्रोजेक्ट्स के साथ तृतीय-पक्ष कोड को मिलाते समय नामकरण टकराव के सिरदर्द से बच सकते हैं।


किसी कारण से मैंने सोचा कि यदि आप फ़ाइल 1 में नामस्थान का उपयोग करते हैं, तो आपको फ़ाइल 2 में फ़ाइल की आवश्यकता या उसे शामिल नहीं करना होगा। यूनिट टेस्टिंग से पता चला कि ऐसा नहीं है।
हारून बेल

1
आप की जाँच करने के लिए चाहते हो सकता है @AaronBell autoloading
cbednarski

21

एक नेमस्पेस आपको एक नाम के तहत कोड का एक गुच्छा रखने की अनुमति देता है और कक्षाओं, कार्यों और स्थिरांक के साथ किसी भी नामकरण संघर्ष नहीं है।

यह आपके कोड को उस नामस्थान में रहने देता है।

नामस्थान स्तर दिखाने के लिए PHP कुछ विवादास्पद चरित्र का उपयोग करता \है। लोग बाहों में उठ गए क्योंकि इसका इस्तेमाल पलायन चरित्र के रूप में भी किया जाता है।

PHP में नाम स्थान का उपयोग करने के लिए, अपनी फ़ाइल के शीर्ष पर कुछ इस तरह का उपयोग करें।

namespace my\namespace;

आप नामस्थानों के लिए आधिकारिक PHP प्रलेखन पर बहुत अधिक जानकारी पा सकते हैं ।


11

चूंकि "नामस्थान" के बारे में जानकर "उपयोग" कीवर्ड के बारे में सीखना आसान है, इसलिए मुझे एक बुनियादी लारवेल परियोजना को देखकर पहले नामस्थान की व्याख्या करने दें।

नाम के साथ एक नियंत्रक वर्ग है: कंट्रोलर। एफपी जो पथ में है: प्रोजेक्ट के रूट डायरेक्टरी से ऐप / एचटीपी / कंट्रोलर । एक अन्य नियंत्रक वर्ग भी है जिसका नाम है: नियंत्रक.php , लेकिन यह एक पथ में है: विक्रेता / प्रोजेक्ट के रूट डायरेक्टरी से लार्वेल / फ्रेमवर्क / src / इल्यूमिनेट / रूटिंग

आपको स्रोत कोड को देखने की आवश्यकता नहीं है, यदि आप php के लिए नए हैं, क्योंकि यह आपको भ्रमित कर सकता है, इसके बजाय मैं आपको इसके बारे में समझाता हूं, जिसके बारे में हम परवाह करते हैं और हमें "नेमस्पेस" और "उपयोग" को समझने में मदद करेंगे "।

तो इस तथ्य के रूप में, हमारा पहला नियंत्रक वर्ग: ऐप / Http / नियंत्रकों / नियंत्रक. php को द्वितीय नियंत्रक वर्ग विक्रेता / लार्वा / फ्रेमवर्क / src / प्रबुद्ध / रूटिंग / नियंत्रक . php का उपयोग करने की आवश्यकता है । वास्तव में कुछ महत्वपूर्ण रूटिंग फ़ंक्शंस को संभालने के लिए अपनी सामग्री तक पहुंच के लिए इस वर्ग को विस्तारित करने की आवश्यकता है।

तो एक वर्ग दूसरे वर्ग का विस्तार कैसे कर सकता है जिसका नाम समान है? class Controller extends Controller? यह तब तक काम नहीं करेगा, जब तक कि इन दो वर्गों में अंतर करने का कोई तरीका नहीं है और यह वह जगह namespaceहै जहां काम आता है और useकीवर्ड मिशन को पूरा करने में मदद करता है, जिसके उपयोग की अनुमति देता है; (वर्ग, विधियाँ; इंटरफेस और स्थिरांक), एक ही नाम के साथ, एक ही दायरे में।

अब यह कोड में कैसे किया जाता है? बहुत आसान! यदि हम app / Http / नियंत्रकों / नियंत्रक.php स्रोत कोड को देखते हैं, तो हम कक्षा नाम स्थान के शीर्ष पर देख सकते हैं:namespace App\Http\Controllersइस तरह से आप अपनी कक्षा को एक नाम स्थान देते हैं, इसलिए इसे अन्य वर्गों के लिए संदर्भित किया जा सकता है। इस दिखता परियोजना के रूट निर्देशिका से इस वर्ग के लिए पथ, थोड़ा अंतर के साथ के रूप में ही और कहा कि "के उपयोग है\" के बदले "/" (कमांड विंडो में शीघ्र रूप में एक ही) , लेकिन वहाँ एक और अंतर है और वह पूंजी के साथ अनुप्रयोग है नेमस्पेस में 'ए' पथ में लोअरकेस 'ए' के ​​साथ 'ऐप'। यह भी ध्यान दें कि नाम स्थान केस-संवेदी है।

इसलिए नाम स्थान पथ की तुलना में एक अलग अवधारणा है, यह पथ संरचना का अनुसरण कर सकता है यदि यह मदद करता है, लेकिन इसके लिए कक्षा, विधि, इंटरफेस या स्थिरांक के लिए सटीक पथ नहीं होना चाहिए उदाहरण के लिए एक नज़र डालें: विक्रेता / लार्वा / फ्रेमवर्क /src/Illuminate/Rout/Controller.php स्रोत कोड,

हम कक्षा के शीर्ष पर देखते हैं कि नाम स्थान घोषित किया गया है: Illuminate\Routing

अब ' use' '' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ कहते है useकि हम अपनी कक्षा में एक विशिष्ट वर्ग या फ़ंक्शन से अवगत कराने के लिए “ ’ ’ ’ ’ ’ ’ ’ कीवर्ड का उपयोग करते हैं, make make ’ ’ ’ ’ कीवर्ड का उपयोग करते हैं।

इसलिए हम आयात नहीं कर रहे हैं या कुछ भी शामिल कर रहे हैं, जिससे हम अपनी कक्षा को बता रहे हैं कि हम एक विशिष्ट वर्ग या विधि का उपयोग करके उनके नामस्थान का उल्लेख करेंगे, आइए एक नजर डालते हैं ऐप / Http / नियंत्रकों / नियंत्रक.php स्रोत कोड के रूप में, आप पंक्ति से देख सकते हैं: " use Illuminate\Routing\Controller as BaseController", " लक्ष्य" वर्ग के लिए नामस्थानuse द्वारा पीछा किया गया कीवर्ड (ध्यान दें कि Illuminate \ Routing \ Controller.php और Illuminate \ Routing \ नियंत्रक '.php एक्सटेंशन' के बिना विनिमेय हैं)।

हम एक विशिष्ट वर्ग, विधि, इंटरफेस या एक उपनाम देने के लिए " as" कीवर्ड के साथ " " कीवर्ड का उपयोग कर सकते हैं , जो कि एप्लिकेशन / Http / नियंत्रकों / नियंत्रक को अनुमति देता है। Illuminate \ Routing \ Controller.php को बेसकंट्रोलर के रूप में विस्तारित करने के लिए । पंक्ति: “ ”।useclass Controller extends BaseController


9

अन्य प्रोग्रामिंग भाषाओं में नामस्थान जैसी तकनीकें हैं (जैसे जावा में पैकेज)। वे एक ही नाम wihtin एक परियोजना के साथ उत्परिवर्ती वर्गों के लिए सक्षम होने के लिए उपयोग किया जाता है।

Php प्रलेखन से ( http://www.php.net/manual/en/language.namespaces.rationale.php ):

नाम स्थान क्या हैं? व्यापक परिभाषा में नामस्थान आइटमों को संक्षिप्त करने का एक तरीका है। इसे कई स्थानों पर एक अमूर्त अवधारणा के रूप में देखा जा सकता है। उदाहरण के लिए, किसी भी ऑपरेटिंग सिस्टम निर्देशिका में समूह से संबंधित फ़ाइलों की सेवा की जाती है, और उनके भीतर फ़ाइलों के लिए एक नामस्थान के रूप में कार्य किया जाता है। एक ठोस उदाहरण के रूप में, फ़ाइल foo.txt दोनों निर्देशिका / होम / greg और / home / अन्य में मौजूद हो सकती है, लेकिन foo.txt की दो प्रतियां एक ही निर्देशिका में सह-अस्तित्व में नहीं हो सकती हैं। इसके अलावा, / home / greg निर्देशिका के बाहर foo.txt फ़ाइल का उपयोग करने के लिए, हमें निर्देशिका नाम का उपयोग करके फ़ाइल नाम को prehend करना होगा ताकि निर्देशिका विभाजक का उपयोग करके /home/greg/foo.txt प्राप्त किया जा सके। यह वही सिद्धांत प्रोग्रामिंग की दुनिया में नामस्थान तक फैला हुआ है।


1
जावा की तुलना करना एक बुरा विचार है। जावा में पैकेज हैं और पैकेज-दृश्यता कक्षाएं हैं। संरक्षित सदस्यों की दृश्यता भी उस पैकेज पर निर्भर करती है जो इसे एक्सेस करता है।
आर्टेफैक्टो

1
वे पैकेज के बराबर नहीं हैं, लेकिन वे समान विचार साझा करते हैं।
2kuboy

जैसा कि सवाल यह भी पूछता है कि सामान्य रूप से क्या नाम स्थान हैं, जवाब समझ में आता है।
kiamlaluno

@kiam वे एक विचार साझा करते हैं - गैर-क्लैशिंग श्रेणी के नाम। वे दृश्यता के विचार को साझा नहीं करते हैं।
अर्टिफैक्टो

@Artefacto: काऊ-बॉय ने नहीं कहा कि दोनों भाषाओं में नामस्थान समान थे।
kiamlaluno

4

PHP में डायरेक्टरी और फाइलें , नेमस्पेस जैसी बहुत सी चीजें ग्रुप क्लास , फंक्शन्स , इंटरफेस और कॉन्स्टेंट के लिए काम करती हैं

उदाहरण:

Filesystem      |   PHP Namespace
----------------|------------------
/Dir/File.txt   |  \Namespace\Class

यह वैश्विक स्थान से वस्तुओं को लपेटने का एक तरीका प्रदान करता है और एक कार्यक्रम में नाम की टक्कर के बिना सादे आइटम नाम के उपयोग की अनुमति देता है। यह PHP 5.3.0, PHP 7 में समर्थित है।

लेकिन PHP नेमस्पेस और यूनिक्स आधारित फाइल सिस्टम के बीच समानता में कुछ सीमाएं हैं:

                          | Filesystem            |        PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive             |       No              |        Yes                
--------------------------|-----------------------|-------------------------
Name with plain number    |       Yes             |        No
--------------------------|-----------------------|-------------------------
Path level                |       Yes             |        Yes   
--------------------------|-----------------------|-------------------------
Plain metacharacters name |       Yes             |        No        

सिद्धांत प्रोग्रामिंग शब्द में नामस्थान तक फैला है।


3

एक नेमस्पेस एक निर्देशिका की तरह काम करता है। आप जानते हैं कि आप निर्देशिका में फ़ाइलों को उसी नाम से रख सकते हैं जैसे कि माता-पिता (या किसी अन्य) निर्देशिका में फ़ाइलें? खैर, एक नेमस्पेस आपको वैरिएबल्स, फंक्शन्स और क्लासेस के लिए एक एप्लीकेशन के अंदर की सुविधा देता है।

स्थिर कार्यों के विशाल वर्गों के लिए थोड़ी देर पहले PHP में एक प्रवृत्ति थी। उन कार्यों में से किसी को कॉल करने का एकमात्र तरीका वर्ग नाम के साथ कॉल को उपसर्ग करना था। यह नामस्थान पर एक आदिम प्रयास था, लेकिन बहुत अधिक लाभ के साथ नहीं।


2

एक नेमस्पेस मूल रूप से आपको एक कंटेनर में कोड डालने देता है। यह दो कार्यों (साथ ही कक्षाएं और चर) के साथ समस्याओं को रोक देगा जो समान नाम साझा करते हैं।

जब एक ही नाम साझा करने वाले कोड के टुकड़ों के साथ बड़े अनुप्रयोगों को रोकने के लिए काम करते समय ये उपयोगी होते हैं।

उदाहरण के लिए, हम कहते हैं कि हम "TheMessage" नामक दो फ़ंक्शन चाहते थे। ये दोनों प्रत्येक संदेश को अलग-अलग प्रिंट (एको) करेंगे। आम तौर पर, यह एक सिंटैक्स त्रुटि का कारण होगा, क्योंकि आपके पास समान नाम साझा करने वाले दो कार्य नहीं हो सकते हैं।

इसे ठीक करने के लिए, आप इन कार्यों को अलग नामस्थानों में रख सकते हैं। यह आपको बिना किसी त्रुटि के दोनों कार्यों का उपयोग करने की अनुमति देगा।


2

नेमस्पेस एक पैक में कई चीजों की पैकेजिंग की तरह है। एक ड्रॉअर के रूप में एक नाम स्थान की कल्पना करें जिसमें आप सभी प्रकार की चीजें डाल सकते हैं: एक पेंसिल, एक शासक, कागज का एक टुकड़ा और इसके आगे। एक-दूसरे की वस्तुओं के उपयोग से बचने के लिए, आप ड्रॉर्स को लेबल करने का निर्णय लेते हैं ताकि यह स्पष्ट हो सके कि किसका क्या है।


0

Namespace का उपयोग कोडों के समूह को संलग्न करने के लिए किया जाता है ताकि उन्हें विभिन्न स्थानों पर बिना नाम संघर्ष के उपयोग किया जा सके। इस बारे में सोचें कि jQuery कोई संघर्ष विधि नहीं है और आप इसे बेहतर समझेंगे।


"JQuery कोई संघर्ष विधि" से आपका क्या अभिप्राय है? यह PHP से कैसे संबंधित है?
निको हसे

0

एक प्रोग्राम में नामों को नियंत्रित करने के लिए एक नामस्थान एक सरल प्रणाली है।
यह सुनिश्चित करता है कि नाम अद्वितीय हैं और किसी भी संघर्ष के लिए नेतृत्व नहीं करेंगे।


आप किस प्रकार के "नामों" के बारे में बात कर रहे हैं?
निको हेस

0

आपके द्वारा बनाए गए कोड, और आंतरिक PHP वर्ग / फ़ंक्शन / स्थिरांक या तृतीय-पक्ष वर्ग / फ़ंक्शन / स्थिरांक के बीच नाम टकराव से बचने के लिए आप नाम स्थान का उपयोग कर सकते हैं। Namespaces में भी alias (या छोटा) Extra_Long_Names है जो पहली समस्या को कम करने के लिए डिज़ाइन किया गया है, जिससे सोर्स कोड की पठनीयता में सुधार होता है।

जैसा कि हम सभी जानते हैं, PHP में नाम स्थान और लक्षण नए नहीं हैं, लेकिन फिर भी कई php डेवलपर्स अपनी जटिलता के कारण इन महान अवधारणाओं का उपयोग नहीं करते हैं। तो, इस पोस्ट में। मैं उन्हें उदाहरणों के साथ साफ़ करने की कोशिश करूँगा। नाम स्थान और लक्षण क्या हैं?

अपने कोड को पुन: प्रयोज्य और एक्स्टेंसिबल बनाने के लिए आप उन्हें अपने कोड में कैसे लागू कर सकते हैं?

नाम स्थान का लाभ

आपके द्वारा बनाए गए कोड, और आंतरिक PHP वर्ग / फ़ंक्शन / स्थिरांक या तृतीय-पक्ष वर्ग / फ़ंक्शन / स्थिरांक के बीच नाम टकराव से बचने के लिए आप नाम स्थान का उपयोग कर सकते हैं।

Namespaces में भी alias (या छोटा) Extra_Long_Names है जो पहली समस्या को कम करने के लिए डिज़ाइन किया गया है, जिससे सोर्स कोड की पठनीयता में सुधार होता है। आइए एक उदाहरण के साथ नाम स्थान को समझते हैं। htdocs (xampp) या www (xwamp) में "php_oops" नाम का एक फ़ोल्डर बनाएं "नेमस्पेस" नाम के रूट डायरेक्टरी के तहत एक नया फ़ोल्डर बनाएं, और फिर नेमस्पेस फोल्डर के तहत एक फाइल इंडेक्स.php बनाएं।

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

संदर्भ- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb


1
कृपया अलग-अलग साइटों पर अपनी खुद की सामग्री को लिंक करने से सावधान रहें, आप स्पैमर नहीं बनना चाहते हैं । आपको यहां अधिकांश सामग्री शामिल करनी चाहिए, और लिंक को केवल संदर्भ के रूप में उपयोग करना चाहिए।
धर्मन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.