PHP
नेमस्पेस
खोज…
टिप्पणियों
नाम स्थान क्या हैं? व्यापक परिभाषा में नामस्थान, एन्कैप्सुलेटिंग आइटम का एक तरीका है। इसे कई स्थानों पर एक अमूर्त अवधारणा के रूप में देखा जा सकता है। उदाहरण के लिए, किसी भी ऑपरेटिंग सिस्टम निर्देशिका में समूह से संबंधित फ़ाइलों की सेवा करते हैं, और उनके भीतर फ़ाइलों के लिए एक नामस्थान के रूप में कार्य करते हैं। एक ठोस उदाहरण के रूप में, फ़ाइल foo.txt निर्देशिका / होम / greg और / home / अन्य दोनों में मौजूद हो सकती है, लेकिन foo.txt की दो प्रतियां एक ही निर्देशिका में सह-अस्तित्व में नहीं हो सकती हैं। इसके अलावा, / home / greg निर्देशिका के बाहर foo.txt फ़ाइल का उपयोग करने के लिए, हमें निर्देशिका नाम को फ़ाइल विभाजक का उपयोग करके निर्देशिका नाम को prehend करना होगा ताकि /home/greg/foo.txt प्राप्त करें। यह वही सिद्धांत प्रोग्रामिंग की दुनिया में नामस्थान तक फैला हुआ है।
ध्यान दें कि शीर्ष-स्तरीय नामस्थान PHP
और php
PHP भाषा के लिए ही आरक्षित हैं। उन्हें किसी भी कस्टम कोड में उपयोग नहीं किया जाना चाहिए।
नाम स्थान की घोषणा
एक नाम स्थान की घोषणा निम्नानुसार दिख सकती है:
-
namespace MyProject;
- नामस्थानMyProject
घोषणा करें -
namespace MyProject\Security\Cryptography;
- एक नेस्टेड नेमस्पेस घोषित करें -
namespace MyProject { ... }
- एक नाम स्थान की घोषणा करें जिसमें कोष्ठक संलग्न हैं।
यह प्रति फ़ाइल केवल एक ही नाम स्थान की घोषणा करने के लिए अनुशंसित है, भले ही आप एकल फ़ाइल में जितने चाहें उतने घोषित कर सकते हैं:
namespace First {
class A { ... }; // Define class A in the namespace First.
}
namespace Second {
class B { ... }; // Define class B in the namespace Second.
}
namespace {
class C { ... }; // Define class C in the root namespace.
}
हर बार जब आप एक नाम स्थान की घोषणा करते हैं, तो आपके द्वारा परिभाषित कक्षाएं उस नामस्थान से संबंधित होंगी:
namespace MyProject\Shapes;
class Rectangle { ... }
class Square { ... }
class Circle { ... }
एक नेमस्पेस घोषणा कई बार अलग-अलग फ़ाइलों में उपयोग की जा सकती है। ऊपर दी गई मिसाल एक फाइल में MyProject\Shapes
नाम स्थान में तीन वर्गों को परिभाषित करती है। अधिमानतः यह तीन फ़ाइलों में विभाजित होगा, प्रत्येक namespace MyProject\Shapes;
साथ शुरू होगा namespace MyProject\Shapes;
। इसे PSR-4 मानक उदाहरण में अधिक विस्तार से समझाया गया है।
एक नाम स्थान में एक वर्ग या कार्य को संदर्भित करना
निम्नांकित नामों की घोषणा के अनुसार, हम एक वर्ग को नाम स्थान में परिभाषित कर सकते हैं:
namespace MyProject\Shapes;
class Rectangle { ... }
इस वर्ग को संदर्भित करने के लिए पूर्ण पथ (नाम स्थान सहित) का उपयोग करने की आवश्यकता है:
$rectangle = new MyProject\Shapes\Rectangle();
यह use
-स्टेट के माध्यम से वर्ग को आयात करके छोटा किया जा सकता है:
// Rectangle becomes an alias to MyProject\Shapes\Rectangle
use MyProject\Shapes\Rectangle;
$rectangle = new Rectangle();
PHP 7.0 के लिए आप ब्रैकेट्स का उपयोग करके एक एकल स्टेटमेंट में विभिन्न use
समूह बना सकते हैं:
use MyProject\Shapes\{
Rectangle, //Same as `use MyProject\Shapes\Rectangle`
Circle, //Same as `use MyProject\Shapes\Circle`
Triangle, //Same as `use MyProject\Shapes\Triangle`
Polygon\FiveSides, //You can also import sub-namespaces
Polygon\SixSides //In a grouped `use`-statement
};
$rectangle = new Rectangle();
कभी-कभी दो वर्गों का एक ही नाम होता है। यह एक समस्या नहीं है अगर वे एक अलग नामस्थान में हैं, लेकिन यह एक समस्या बन सकती है जब उन्हें use
साथ आयात करने का प्रयास किया जाता है:
use MyProject\Shapes\Oval;
use MyProject\Languages\Oval; // Apparantly Oval is also a language!
// Error!
यह स्वयं को उपनाम के as
उपयोग करके उपनाम के लिए एक नाम निर्धारित करके हल किया जा सकता है:
use MyProject\Shapes\Oval as OvalShape;
use MyProject\Languages\Oval as OvalLanguage;
वर्तमान नामस्थान के बाहर एक वर्ग का संदर्भ देने के लिए, इसे a \
_ के साथ बचाना होगा, अन्यथा वर्तमान नामस्थान से एक रिश्तेदार नेमस्पेस पथ मान लिया जाता है:
namespace MyProject\Shapes;
// References MyProject\Shapes\Rectangle. Correct!
$a = new Rectangle();
// References MyProject\Shapes\Rectangle. Correct, but unneeded!
$a = new \MyProject\Shapes\Rectangle();
// References MyProject\Shapes\MyProject\Shapes\Rectangle. Incorrect!
$a = new MyProject\Shapes\Rectangle();
// Referencing StdClass from within a namespace requires a \ prefix
// since it is not defined in a namespace, meaning it is global.
// References StdClass. Correct!
$a = new \StdClass();
// References MyProject\Shapes\StdClass. Incorrect!
$a = new StdClass();
Namespaces क्या हैं?
PHP समुदाय में बहुत सारे डेवलपर्स हैं जो बहुत सारे कोड बनाते हैं। इसका मतलब है कि एक लाइब्रेरी का PHP कोड एक ही क्लास के नाम को दूसरे लाइब्रेरी की तरह इस्तेमाल कर सकता है। जब दोनों पुस्तकालयों को एक ही नामस्थान में उपयोग किया जाता है, तो वे टकराते हैं और परेशानी पैदा करते हैं।
नाम स्थान इस समस्या को हल करते हैं। जैसा कि PHP संदर्भ पुस्तिका में वर्णित है, नामस्थानों की तुलना ऑपरेटिंग सिस्टम निर्देशिकाओं से की जा सकती है जो नामस्थान फाइलें; एक ही नाम वाली दो फाइलें अलग-अलग निर्देशिकाओं में मौजूद हो सकती हैं। इसी तरह, एक ही नाम वाली दो PHP कक्षाएं अलग-अलग PHP नामस्थानों में सह-अस्तित्व में हो सकती हैं।
आपके लिए अपने कोड को नामांकित करना महत्वपूर्ण है ताकि इसका उपयोग अन्य डेवलपर्स द्वारा अन्य पुस्तकालयों से टकराने के डर के बिना किया जा सके।
उप-नाम स्थान की घोषणा
उदाहरण के लिए पदानुक्रम उपयोग के साथ एक ही नाम स्थान की घोषणा करना:
namespace MyProject\Sub\Level;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
उपरोक्त उदाहरण बनाता है:
निरंतर MyProject\Sub\Level\CONNECT_OK
वर्ग MyProject\Sub\Level\Connection
और
फ़ंक्शन MyProject\Sub\Level\connect