Php में नेमस्पेस का उपयोग करने के उदाहरण. PHP में नेमस्पेस, समझाया गया। नामस्थान: विवरण के अनेक क्षेत्र
मैंने हाल ही में अपने प्रोजेक्ट को नेमस्पेस में इनकैप्सुलेट किया और उचित दस्तावेज़ीकरण की कमी की समस्या का सामना करना पड़ा। हम जो कुछ भी ढूंढने में कामयाब रहे, वह लगभग 2009 का है, और यह लगभग 2012 का है... मिली सामग्री में, बहुत सारे गैर-कार्यशील स्थान हैं जो कुछ ऐसा उपयोग करते हैं जो PHP के वर्तमान संस्करण में नहीं है। इस संबंध में, मैं इस मुद्दे पर कुछ प्रकाश डालना चाहूंगा।
तो, नेमस्पेस या नेमस्पेस क्या है? महान विकिपीडिया उन्हें इस प्रकार परिभाषित करता है:
नेमस्पेस एक सेट है, जिसका अर्थ है अद्वितीय पहचानकर्ताओं (अर्थात, नाम) के तार्किक समूह के लिए बनाया गया एक मॉडल, अमूर्त भंडारण या वातावरण। किसी नामस्थान में परिभाषित एक पहचानकर्ता उस नामस्थान से संबद्ध होता है। एक ही पहचानकर्ता को कई स्थानों में स्वतंत्र रूप से परिभाषित किया जा सकता है। इस प्रकार, एक नामस्थान में परिभाषित पहचानकर्ता से जुड़े मूल्य का अर्थ किसी अन्य नामस्थान में परिभाषित समान पहचानकर्ता के समान (या नहीं) हो सकता है। नेमस्पेस-जागरूक भाषाएं उन नियमों को परिभाषित करती हैं जो इंगित करती हैं कि पहचानकर्ता किस नेमस्पेस से संबंधित है (अर्थात, इसकी परिभाषा)।विकी
सब साफ? यह वास्तव में सरल है. संस्करण 5.3 से पहले, php में केवल दो स्थान थे - वैश्विक (जिसमें आपका मुख्य कोड निष्पादित किया गया था) और स्थानीय (जिसमें फ़ंक्शन चर परिभाषित किए गए थे)।
संस्करण 5.3 के बाद से सब कुछ बदल गया है। अब आप अपना नेमस्पेस परिभाषित कर सकते हैं जिसमें आपकी कक्षाएं, विधियां आदि मौजूद होंगी।
मुझे आशा है कि यह थोड़ा स्पष्ट हो गया होगा।
मैंने विशेष रूप से कक्षाओं का नाम वही रखा है। चूँकि उन्हें अलग-अलग स्थानों में परिभाषित किया गया है, समान नाम के बावजूद, वे दो अलग-अलग वर्ग हैं। मुख्य स्क्रिप्ट अभी भी वैश्विक स्थान पर कार्य करती है, यहां कुछ भी नहीं बदला है और कक्षाएं और फ़ंक्शन अभी भी इसमें परिभाषित किए जा सकते हैं। तो फिर रिक्त स्थान किस लिए हैं? सबसे पहले, यह सुनिश्चित करने के लिए कि जब आप किसी फ़्रेमवर्क या लाइब्रेरी के साथ फ़ाइल शामिल करते हैं, तो आपकी कक्षाएं फ़्रेमवर्क की कक्षाओं को ओवरराइड नहीं करेंगी या इसके विपरीत।
अपने नेमस्पेस में परिभाषित कक्षाओं का उपयोग करने के लिए, आपको अपने द्वारा परिभाषित स्पेस को वैश्विक में सही जगह पर आयात करने की आवश्यकता है (मैं आमतौर पर फ़ाइल की शुरुआत में ऐसा करना पसंद करता हूं)। ऐसा करने के लिए, उपयोग कीवर्ड का उपयोग करें
ध्यान:किसी कारण से php कीवर्ड के उपयोग की अनुमति नहीं देता है उपयोगकंडीशन ब्लॉक और लूप में
आइए चित्रों से उदाहरण लें और इसे कोड में लागू करें:
ध्यान:नेमस्पेस कीवर्ड फ़ाइल की शुरुआत में, तुरंत बाद स्थित होना चाहिए php
फ़ाइल A.php
php namespace A { class A { public static function say() { echo "Я пространство имен А"; } } }
B.php फ़ाइल
php namespace B { class A { public static function say() { echo "Я пространство имен B"; } } }
एक वैकल्पिक वाक्यविन्यास संभव है:
php namespace A; class A { public static function say() { echo "Я пространство имен А"; } }
प्रत्येक नामस्थान को एक अलग फ़ाइल में घोषित करने की अनुशंसा की जाती है। हालाँकि यह एक में संभव है, यह सख्ती से अनुशंसित नहीं है!
अब तीसरी फाइल पर चलते हैं, जिसमें हमारी मुख्य स्क्रिप्ट काम करेगी
Index.php
php
require_once "A.php";
require_once "B.php";
use A\A;
use B\A;
ऐसा लगता है कि यह एक फायदा है, केवल अधिक कोड जोड़ा जाता है, लेकिन यह पूरी तरह से सच नहीं है, थोड़ा आगे मैं एक ऑटोलोड क्लास का उदाहरण दूंगा, जिसके साथ कक्षाओं के साथ फ़ाइलों को जोड़ने वाली लाइनें अनावश्यक होंगी।
अब आइए हमारी कक्षाओं पर नजर डालें।
php
require_once "A.php";
require_once "B.php";
use A\A;
use B\A;
A\A::say();
B\A::say();
ध्यान: PHP नेमस्पेसेस में स्कोप रिज़ॉल्यूशन ऑपरेटर (::) का उपयोग करना अनुमति नहीं! एकमात्र चीज़ जिसके लिए यह उपयुक्त है वह है स्थिर वर्ग विधियों और स्थिरांकों तक पहुँचना। पहले तो वे इसे नेमस्पेस के लिए उपयोग करना चाहते थे, लेकिन फिर उत्पन्न समस्याओं के कारण उन्होंने इसके विरुद्ध निर्णय लिया। इसलिए, A::A::say() जैसा निर्माण; अमान्य है और इसके परिणामस्वरूप त्रुटि होगी.
नामस्थानों के लिए आपको बैकस्लैश वर्ण "\" का उपयोग करना होगा
ध्यान:गलतफहमी से बचने के लिए, स्ट्रिंग में उपयोग किए जाने पर इस वर्ण से बचना आवश्यक है: "\\"
नेमस्पेस को एक-दूसरे के अंदर नेस्ट किया जा सकता है, आइए इसे अपनी A.php फ़ाइल में जोड़ें:
php
namespace A
{
class A
{
public static function say()
{
echo "Я пространство имен А";
}
}
}
namespace A\subA
{
class A
{
public static function say()
{
echo "Я подпространство имен А";
}
}
}
और सूचकांक में हम निम्नलिखित लिखेंगे:
php
require_once "A.php";
require_once "B.php";
use A\A as A;
use B\A as B;
use A\subA as sub
A::say();
A::say();
sub::say();
एक महत्वपूर्ण बिंदु आयातित स्थानों के लिए उपनामों का उपयोग करना है। आप A\subA::say() लिख सकते हैं; आप इस बात से सहमत होंगे कि हर बार रिक्त स्थान के लिए पूर्ण पथ लिखना मुश्किल है; इससे बचने के लिए, उपनाम पेश किए गए थे। संकलन करते समय, निम्नलिखित होगा: उपनाम उप के बजाय, A\subA को प्रतिस्थापित किया जाएगा, इसलिए हमें कॉल A\subA::say();
तब क्या होता है जब वैश्विक स्थान में परिभाषित फ़ंक्शन को कॉल किया जाता है? PHP सबसे पहले उस स्थान के भीतर एक फ़ंक्शन की तलाश करता है जहां आप वर्तमान में काम कर रहे हैं, और यदि उसे यह नहीं मिलता है, तो यह वैश्विक दायरे में चला जाता है। यह तुरंत इंगित करने के लिए कि आप एक वैश्विक फ़ंक्शन का उपयोग कर रहे हैं, आपको इसके पहले बैकस्लैश लगाना होगा।
रिक्त स्थान से कक्षाओं को स्वचालित रूप से लोड करने में होने वाली समस्याओं से बचने के लिए, फ़ाइल सिस्टम को रिक्त स्थान के संगठन के समान ही व्यवस्थित किया जाना चाहिए। उदाहरण के लिए, हमारे पास एक रूट फ़ोल्डर कक्षाएं हैं, जहां हमारी कक्षाएं संग्रहीत की जाएंगी, फिर हमारे रिक्त स्थान को निम्नानुसार व्यवस्थित किया जा सकता है
कक्षाएं\A\A.php
class\A\sub\A.php (उप उपस्थान को एक अलग फ़ाइल में रखा जाएगा)
कक्षाएं\B\B.php
PHP में एक जादुई स्थिरांक __NAMESPACE__ है जिसमें वर्तमान स्थान का नाम होता है।
और अब ऑटोलोडिंग के बारे में।
नीचे दी गई कक्षा मेरी नहीं है, मैंने बस इसे काम में लिया है और इसमें थोड़ा सुधार किया है, यहां से लिया गया है।ध्यान:आपकी कक्षाओं को लोड करने के लिए, कक्षा का नाम फ़ाइल नाम से मेल खाना चाहिए!
" .$फ़ाइल ।" in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); ब्रेक; ) ऑटोलोडर::रिकर्सिव_ऑटोलोड($फाइल, $पाथ2, और$फ्लैग); ) ) क्लोजडिर($हैंडल); ) ) प्राइवेट स्टैटिक फंक्शन StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"]।" /Log/Log.html"; $file = fopen($dir, "a"); झुंड($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s") ।"
║
" .PHP_EOL)); झुंड ($ फ़ाइल, LOCK_UN); fclose ($ फ़ाइल); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
यदि आप लोडिंग के लिए आने वाली कक्षाओं के नामों को देखते हैं, तो आप देखेंगे कि प्रत्येक कक्षा के पहले उपयोग में निर्दिष्ट नामस्थान से एक उपसर्ग लगा हुआ है। यही कारण है कि मैं नेमस्पेस के समान निर्देशिकाओं में फ़ाइलों के स्थान का उपयोग करने की अनुशंसा करता हूं; इससे खोज एक या दो पुनरावृत्तियों तक तेज हो जाती है।
अब हमारा सूचकांक इस प्रकार लिखा जा सकता है:
php
require_once "Autoloader.php";
use Autoloader as Autoloader;
use A\A as A;
use B\A as B;
use A\subA as sub
A::say();
A::say();
sub::say();
अब आपके द्वारा उपयोग की जाने वाली सभी कक्षाएं और इंटरफ़ेस स्वचालित रूप से लोड हो जाएंगे।
रिक्त स्थान के साथ भाषा की कुछ गतिशील क्षमताओं को प्रदर्शित करने के लिए, आइए एक और वर्ग घोषित करें:
परीक्षण.php
php
namespace mySpace
{
class test
{
__construct()
{
//конструктор;
}
function sayName($name)
{
echo "Привет " . $name;
}
static function sayOther()
{
echo "статичный вызов";
}
}
}
Index.php
php
require_once "Autoloader.php";
use Autoloader as Autoloader;
use mySpace\test as test
//можно, например сделать так
$class = "test";
//приведет к вызову конструктора
$obj = new $class;
$obj->कहोनाम("परीक्षण"); //या आप यह परीक्षण कर सकते हैं\sayName("test2"); //या इस तरह $obj::sayName("test"); //या आप यह परीक्षण कर सकते हैं::sayName("test2");
मुझे आशा है कि मेरा लेख किसी के लिए उपयोगी होगा।
PHP ने, संस्करण 5.3 से शुरू करके, हमें नेमस्पेस दिए। तब से, इस नामस्थान का उपयोग कैसे किया जाए, इस बारे में कुछ सुस्त और कुछ गरमागरम चर्चा हुई है?
सिम्फनी, लारवेल और निश्चित रूप से ज़ेंड जैसे कुछ फ्रेमवर्क ने इस तकनीक को अपनाया है।
यह सब कमोबेश एमवीसी योजना में फिट बैठता है। एक, शायद शाश्वत, बहस बनी हुई है: एप्लिकेशन का मुख्य विवाह जोड़ा क्या होना चाहिए - मॉडल और नियंत्रक?
कुछ लोग हमें बताते हैं कि मॉडल को मोटा और मोटा होना चाहिए और उसके साथ पतला और पतला कंट्रोलर होना चाहिए। एक शब्द में - मातृसत्ता.
इसके विपरीत, दूसरों का मानना है कि नियंत्रक को हर चीज का प्रबंधन और आदेश देना चाहिए, इसलिए वह ठोस और अच्छी तरह से पोषित हो जाता है। और उसके साथ एक दुबली-पतली मॉडल है, जिसका काम देना और लाना है। यह पितृसत्ता है.
तो एमवीसी योजना में कौन बेहतर है? पितृसत्ता या मातृसत्ता?
आइए इसे लोकतंत्र पर आधारित परिवार इकाई के निर्माण के नजरिए से देखें। और नेमस्पेस को इसमें हमारी सहायता करने दीजिए।
हमें मोटे, भद्दे नियंत्रक पसंद नहीं हैं, जो चीन की दुकान में बैल की तरह, यदि आप लापरवाह हैं तो पूरे एप्लिकेशन को कुचल सकते हैं।
हमें मोटी मॉडल भी पसंद नहीं हैं. खैर, उन्हें कौन पसंद करता है? उन्हें मंच के योग्य होना चाहिए!
आइए नेमस्पेस की मदद से, एक अच्छे मैचमेकर की तरह, एक सामंजस्यपूर्ण परिवार बनाने का प्रयास करें।
सबसे पहले, आइए एप्लिकेशन फ़्रेमवर्क बनाएं। यह चाहे जितना साधारण हो, इसे एक ब्लॉग ही रहने दें।
हमने एक बुनियादी संरचना बनाई है जहां:
- ब्लॉग हमारे एप्लिकेशन का भंडारण है;
- दृश्य और टेम्पलेट - दृश्य और टेम्पलेट का भंडारण;
- उपयोगिता - साझा पुस्तकालयों का भंडार;
- Index.php - बूटस्ट्रैप स्क्रिप्ट;
- पोस्ट - यह वह जगह है जहां नियंत्रक और मॉडल का पारिवारिक आदर्श घटित होना चाहिए।
Index.php के साथ सब कुछ सरल है:
दौड़ना(); /* *index.php का अंत*/
हम आवश्यक पथ निर्धारित करते हैं और एक ऑटोलोडर बनाते हैं।
ऑटोलोडर आवश्यक कक्षाओं को लोड करता है, जो क्लास नेमस्पेस के अनुसार फ़ोल्डर पदानुक्रम में स्थित होते हैं। उदाहरण के लिए, BlogPostServicesView वर्ग को ब्लॉग/पोस्ट/सेवाओं में खोजा जाएगा।
और यहां नेमस्पेस के साथ पहली बैठक है।
जब हम Index.php प्रारंभ करते हैं, तो हम ब्लॉग एप्लिकेशन का एक उदाहरण बनाते हैं, जिसकी कक्षा Blog/Blog.php से लोड की जाती है।
आइए उस पर नजर डालें.
पोस्ट = नया पोस्ट(); ) सार्वजनिक फ़ंक्शन रन() ($यह->पोस्ट->देखें->सभी(); ) //अंत वर्ग ब्लॉग
ब्लॉग क्लास बनाते समय, हम नेमस्पेस ब्लॉगपोस्ट के साथ इसमें एक पोस्ट क्लास इंजेक्ट करते हैं और ऑटोलोडर इसे ब्लॉग/पोस्ट/पोस्ट.php से लोड करता है।
संभवतः इस वर्ग को नियंत्रक कहा जा सकता है,
दृश्य = नया दृश्य(); ) )//एंड क्लास पोस्ट
पोस्ट इकाई में शामिल हैं:
- डेटा रिकॉर्ड की संरचना ही - BlogPostEntitiesPostEntity.php
नियंत्रक अनुरोधों को पूरा करने वाली सेवाएँ - BlogPostServicesView.php (उदाहरण के लिए, सेवाओं में से एक)
डीबी = नया डीबी(); )//end __construct सार्वजनिक फ़ंक्शन सभी() ($ पोस्ट = $this->db->सर्वे(); Contemplate::compose(array("header" => "header", "main" => "main", "पादलेख" => "पादलेख",), सरणी("पोस्ट" => $पोस्ट, "शीर्षक" => "वाइपर साइट",)); ) ) //अंत वर्ग पोस्टव्यू
डेटाबेस इंटरेक्शन सिस्टम - BlogPostRepositoriesDB.php - यहाँ यह है, हमारा पतला, सुंदर मॉडल,
बस इसे दे दो, इसे ले आओ, और कुछ नहीं!
डीबीएच = नया पीडीओ ("mysql:host=localhost;dbname=test", $user, $pass, array(PDO::ATTR_PERSISTENT => true)); ) पकड़ें (PDOException $e) ( echo "Error!: " . $e->getMessage() . "
"; मरो(); ) )//end __construct सार्वजनिक फ़ंक्शन सर्वेक्षण() ($query_view = $this->dbh->prepare("SELECT * from post"); $query_view->execute(); return $query_view- >fetchAll(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//अंत सर्वेक्षण )//अंत वर्ग Db
परिणामस्वरूप, हम एक एप्लिकेशन संरचना बनाने में सक्षम हुए जहां सभी घटक अच्छी तरह से जुड़े हुए हैं, जबकि हमने कक्षाओं का स्पष्ट पृथक्करण हासिल किया है, जहां प्रत्येक वर्ग अपना कार्य करता है। हमारा नियंत्रक पतला है और साथ ही शक्तिशाली भी है। मॉडल उससे मेल खाती है. उत्तम परिवार!
और नेमस्पेस को बहुत-बहुत धन्यवाद।
मैं बहस नहीं करता, कई मामलों में रूपरेखा सुविधाजनक है। लेकिन देखिए, नेमस्पेस आपको कुछ भी याद नहीं दिलाता?
कक्षाओं में एक स्पष्ट विभाजन, निर्देशिकाओं और कक्षाओं का एक सख्त और साथ ही लचीला पदानुक्रम, पूरी तरह से डेवलपर के अधीन।
कभी-कभी फ़्रेमवर्क के रूप में सैकड़ों फ़ाइलों और कक्षाओं के रूप में ऐसा कोई महत्वपूर्ण ऐड-ऑन नहीं होता है।
वर्गों और घटकों की परस्पर क्रिया के लिए नियमों के प्रोक्रस्टियन बिस्तर का अभाव।
यह लेख लारवेल फ्रेमवर्क के लेखक टेलर ओटवेल के इस विषय पर विचारों से प्रेरित था, जिसके लिए उन्हें बहुत धन्यवाद।
GitHub पर उदाहरण स्रोत कोड का पता।
नमस्ते। आज के लेख में हम देखेंगे, PHP में नेमस्पेस क्या हैं.
अगर आप इसे लंबे समय से इस्तेमाल कर रहे हैं उफ़, तो आपको शायद ऐसी स्थिति का सामना करना पड़ा है, जब किसी तृतीय-पक्ष लाइब्रेरी को कनेक्ट करते समय, आपको इस तथ्य के कारण विफलता का अनुभव हुआ कि आप पहले से ही अपने कोड में लाइब्रेरी के समान क्लास नामों का उपयोग कर रहे हैं। ऐसा विशेष रूप से तब हो सकता है जब आप जैसे सामान्य नामों का उपयोग करते हैं "नमूना", "डीबी"और इसी तरह। मैं अब आपको बताऊंगा कि इसे कैसे ठीक किया जाए।
नाम स्थान- यह विशिष्ट पहचानकर्ताओं (नामों) के अमूर्त समूहन के लिए बनाया गया एक प्रकार का भंडारण है।
वे। यदि तुम प्रयोग करते हो नामस्थान, तो आप तृतीय-पक्ष लाइब्रेरीज़ को सुरक्षित रूप से कनेक्ट कर सकते हैं और इस बात से डरें नहीं कि उनके नाम आपके कोड के समान होंगे। आइए सिद्धांत के साथ समाप्त करें और अभ्यास की ओर बढ़ें।
चलिए एक फाइल बनाते हैं myclass.phpइस सामग्री के साथ
नेमस्पेस my\oneProject;
क्लास माईक्लास ( )
?>
यहां हमने नेमस्पेस में एक क्लास बनाई है मेरा\oneProject. वैसे, आपको बिल्कुल बैकस्लैश लिखना होगा। भ्रमित मत होइए!
अब फ़ाइल में Index.phpआइए निम्नलिखित लिखें
require_once('myclass.php');
$mc = नया MyClass(); // त्रुटि: वर्ग नहीं मिला
$mc = नया my\oneProject\MyClass(); // सब कुछ काम कर रहा है
?>
जैसा कि आप देख सकते हैं, अब इस तरह से क्लास बनाना संभव नहीं है, आपको यह निर्दिष्ट करना होगा कि कौन सा है नाम स्थानवह लेटा हुआ है.
हम एक साथ कई निर्दिष्ट कर सकते हैं नामस्थानएक फ़ाइल में
नेमस्पेस प्रोजेक्ट;
स्थिरांक CONNECT_OK = 1;
क्लास कनेक्शन ( )
फ़ंक्शन कनेक्ट() ( )
नेमस्पेसअदरप्रोजेक्ट;
स्थिरांक CONNECT_OK = 1;
क्लास कनेक्शन ( )
फ़ंक्शन कनेक्ट() ( )
?>
इस तथ्य के बावजूद कि हमारे पास वर्गों, कार्यों और स्थिरांकों के बिल्कुल समान नाम हैं, हमारे पास नाम संघर्ष नहीं होगा, क्योंकि वे अलग-अलग स्थानों पर स्थित हैं।
हम ब्रैकेट सिंटैक्स का भी उपयोग कर सकते हैं।
नेमस्पेस प्रोजेक्ट (
स्थिरांक CONNECT_OK = 1;
क्लास कनेक्शन ( )
फ़ंक्शन कनेक्ट() ( )
}
नेमस्पेस अन्यप्रोजेक्ट (
स्थिरांक CONNECT_OK = 1;
क्लास कनेक्शन ( )
फ़ंक्शन कनेक्ट() ( )
}
?>
यदि आप कोड को इसमें जोड़ते हैं वैश्विक नामस्थानअन्य स्थानों में कोड के साथ, केवल कोष्ठक वाले सिंटैक्स का उपयोग किया जाता है।
नेमस्पेस प्रोजेक्ट (
स्थिरांक CONNECT_OK = 1;
क्लास कनेक्शन ( )
फ़ंक्शन कनेक्ट() ( )
}
नेमस्पेस ( // वैश्विक कोड
session_start();
$a = प्रोजेक्ट\कनेक्ट();
इको प्रोजेक्ट\कनेक्शन::स्टार्ट();
}
?>
साथ ही, यह न भूलें कि नेमस्पेस को परिभाषित करना हमेशा कोड की पहली पंक्ति होनी चाहिए। ऐसे लिखोगे तो गलती हो जायेगी
यह पता लगाने के लिए कि आप वर्तमान में किस नामस्थान में हैं, आप स्थिरांक का उपयोग कर सकते हैं __नामस्थान__
नेमस्पेस प्रोजेक्ट;
इको """, __NAMESPACE__, """; // "प्रोजेक्ट" प्रिंट करेगा
?>
उदाहरण के लिए, इस स्थिरांक का उपयोग करके आप गतिशील रूप से नाम बना सकते हैं
नेमस्पेस प्रोजेक्ट;
फ़ंक्शन incl($classname) (
$a = __NAMESPACE__ . "\\"। $वर्गनाम;
नया $a लौटाएँ;
}
?>
तो आज के लिए बस इतना ही. आप पाठ्यक्रम लेकर अधिक जानकारी और व्यावहारिक ज्ञान प्राप्त कर सकते हैं
मैंने हाल ही में अपने प्रोजेक्ट को नेमस्पेस में इनकैप्सुलेट किया और उचित दस्तावेज़ीकरण की कमी की समस्या का सामना करना पड़ा। हम जो कुछ भी ढूंढने में कामयाब रहे, वह लगभग 2009 का है, और यह लगभग 2012 का है... मिली सामग्री में, बहुत सारे गैर-कार्यशील स्थान हैं जो कुछ ऐसा उपयोग करते हैं जो PHP के वर्तमान संस्करण में नहीं है। इस संबंध में, मैं इस मुद्दे पर कुछ प्रकाश डालना चाहूंगा।
तो, नेमस्पेस या नेमस्पेस क्या है? महान विकिपीडिया उन्हें इस प्रकार परिभाषित करता है:
नेमस्पेस एक सेट है, जिसका अर्थ है अद्वितीय पहचानकर्ताओं (अर्थात, नाम) के तार्किक समूह के लिए बनाया गया एक मॉडल, अमूर्त भंडारण या वातावरण। किसी नामस्थान में परिभाषित एक पहचानकर्ता उस नामस्थान से संबद्ध होता है। एक ही पहचानकर्ता को कई स्थानों में स्वतंत्र रूप से परिभाषित किया जा सकता है। इस प्रकार, एक नामस्थान में परिभाषित पहचानकर्ता से जुड़े मूल्य का अर्थ किसी अन्य नामस्थान में परिभाषित समान पहचानकर्ता के समान (या नहीं) हो सकता है। नेमस्पेस-जागरूक भाषाएं उन नियमों को परिभाषित करती हैं जो इंगित करती हैं कि पहचानकर्ता किस नेमस्पेस से संबंधित है (अर्थात, इसकी परिभाषा)।विकी
सब साफ? यह वास्तव में सरल है. संस्करण 5.3 से पहले, php में केवल दो स्थान थे - वैश्विक (जिसमें आपका मुख्य कोड निष्पादित किया गया था) और स्थानीय (जिसमें फ़ंक्शन चर परिभाषित किए गए थे)।
संस्करण 5.3 के बाद से सब कुछ बदल गया है। अब आप अपना नेमस्पेस परिभाषित कर सकते हैं जिसमें आपकी कक्षाएं, विधियां आदि मौजूद होंगी।
मुझे आशा है कि यह थोड़ा स्पष्ट हो गया होगा।
मैंने विशेष रूप से कक्षाओं का नाम वही रखा है। चूँकि उन्हें अलग-अलग स्थानों में परिभाषित किया गया है, समान नाम के बावजूद, वे दो अलग-अलग वर्ग हैं। मुख्य स्क्रिप्ट अभी भी वैश्विक स्थान पर कार्य करती है, यहां कुछ भी नहीं बदला है और कक्षाएं और फ़ंक्शन अभी भी इसमें परिभाषित किए जा सकते हैं। तो फिर रिक्त स्थान किस लिए हैं? सबसे पहले, यह सुनिश्चित करने के लिए कि जब आप किसी फ़्रेमवर्क या लाइब्रेरी के साथ फ़ाइल शामिल करते हैं, तो आपकी कक्षाएं फ़्रेमवर्क की कक्षाओं को ओवरराइड नहीं करेंगी या इसके विपरीत।
अपने नेमस्पेस में परिभाषित कक्षाओं का उपयोग करने के लिए, आपको अपने द्वारा परिभाषित स्पेस को वैश्विक में सही जगह पर आयात करने की आवश्यकता है (मैं आमतौर पर फ़ाइल की शुरुआत में ऐसा करना पसंद करता हूं)। ऐसा करने के लिए, उपयोग कीवर्ड का उपयोग करें
ध्यान:किसी कारण से php कीवर्ड के उपयोग की अनुमति नहीं देता है उपयोगकंडीशन ब्लॉक और लूप में
आइए चित्रों से उदाहरण लें और इसे कोड में लागू करें:
ध्यान:नेमस्पेस कीवर्ड फ़ाइल की शुरुआत में, तुरंत बाद स्थित होना चाहिए php
फ़ाइल A.php
php namespace A { class A { public static function say() { echo "Я пространство имен А"; } } }
B.php फ़ाइल
php namespace B { class A { public static function say() { echo "Я пространство имен B"; } } }
एक वैकल्पिक वाक्यविन्यास संभव है:
php namespace A; class A { public static function say() { echo "Я пространство имен А"; } }
प्रत्येक नामस्थान को एक अलग फ़ाइल में घोषित करने की अनुशंसा की जाती है। हालाँकि यह एक में संभव है, यह सख्ती से अनुशंसित नहीं है!
अब तीसरी फाइल पर चलते हैं, जिसमें हमारी मुख्य स्क्रिप्ट काम करेगी
Index.php
php
require_once "A.php";
require_once "B.php";
use A\A;
use B\A;
ऐसा लगता है कि यह एक फायदा है, केवल अधिक कोड जोड़ा जाता है, लेकिन यह पूरी तरह से सच नहीं है, थोड़ा आगे मैं एक ऑटोलोड क्लास का उदाहरण दूंगा, जिसके साथ कक्षाओं के साथ फ़ाइलों को जोड़ने वाली लाइनें अनावश्यक होंगी।
अब आइए हमारी कक्षाओं पर नजर डालें।
php
require_once "A.php";
require_once "B.php";
use A\A;
use B\A;
A\A::say();
B\A::say();
ध्यान: PHP नेमस्पेसेस में स्कोप रिज़ॉल्यूशन ऑपरेटर (::) का उपयोग करना अनुमति नहीं! एकमात्र चीज़ जिसके लिए यह उपयुक्त है वह है स्थिर वर्ग विधियों और स्थिरांकों तक पहुँचना। पहले तो वे इसे नेमस्पेस के लिए उपयोग करना चाहते थे, लेकिन फिर उत्पन्न समस्याओं के कारण उन्होंने इसके विरुद्ध निर्णय लिया। इसलिए, A::A::say() जैसा निर्माण; अमान्य है और इसके परिणामस्वरूप त्रुटि होगी.
नामस्थानों के लिए आपको बैकस्लैश वर्ण "\" का उपयोग करना होगा
ध्यान:गलतफहमी से बचने के लिए, स्ट्रिंग में उपयोग किए जाने पर इस वर्ण से बचना आवश्यक है: "\\"
नेमस्पेस को एक-दूसरे के अंदर नेस्ट किया जा सकता है, आइए इसे अपनी A.php फ़ाइल में जोड़ें:
php
namespace A
{
class A
{
public static function say()
{
echo "Я пространство имен А";
}
}
}
namespace A\subA
{
class A
{
public static function say()
{
echo "Я подпространство имен А";
}
}
}
और सूचकांक में हम निम्नलिखित लिखेंगे:
php
require_once "A.php";
require_once "B.php";
use A\A as A;
use B\A as B;
use A\subA as sub
A::say();
A::say();
sub::say();
एक महत्वपूर्ण बिंदु आयातित स्थानों के लिए उपनामों का उपयोग करना है। आप A\subA::say() लिख सकते हैं; आप इस बात से सहमत होंगे कि हर बार रिक्त स्थान के लिए पूर्ण पथ लिखना मुश्किल है; इससे बचने के लिए, उपनाम पेश किए गए थे। संकलन करते समय, निम्नलिखित होगा: उपनाम उप के बजाय, A\subA को प्रतिस्थापित किया जाएगा, इसलिए हमें कॉल A\subA::say();
तब क्या होता है जब वैश्विक स्थान में परिभाषित फ़ंक्शन को कॉल किया जाता है? PHP सबसे पहले उस स्थान के भीतर एक फ़ंक्शन की तलाश करता है जहां आप वर्तमान में काम कर रहे हैं, और यदि उसे यह नहीं मिलता है, तो यह वैश्विक दायरे में चला जाता है। यह तुरंत इंगित करने के लिए कि आप एक वैश्विक फ़ंक्शन का उपयोग कर रहे हैं, आपको इसके पहले बैकस्लैश लगाना होगा।
रिक्त स्थान से कक्षाओं को स्वचालित रूप से लोड करने में होने वाली समस्याओं से बचने के लिए, फ़ाइल सिस्टम को रिक्त स्थान के संगठन के समान ही व्यवस्थित किया जाना चाहिए। उदाहरण के लिए, हमारे पास एक रूट फ़ोल्डर कक्षाएं हैं, जहां हमारी कक्षाएं संग्रहीत की जाएंगी, फिर हमारे रिक्त स्थान को निम्नानुसार व्यवस्थित किया जा सकता है
कक्षाएं\A\A.php
class\A\sub\A.php (उप उपस्थान को एक अलग फ़ाइल में रखा जाएगा)
कक्षाएं\B\B.php
PHP में एक जादुई स्थिरांक __NAMESPACE__ है जिसमें वर्तमान स्थान का नाम होता है।
और अब ऑटोलोडिंग के बारे में।
नीचे दी गई कक्षा मेरी नहीं है, मैंने बस इसे काम में लिया है और इसमें थोड़ा सुधार किया है, यहां से लिया गया है।ध्यान:आपकी कक्षाओं को लोड करने के लिए, कक्षा का नाम फ़ाइल नाम से मेल खाना चाहिए!
" .$फ़ाइल ।" in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); ब्रेक; ) ऑटोलोडर::रिकर्सिव_ऑटोलोड($फाइल, $पाथ2, और$फ्लैग); ) ) क्लोजडिर($हैंडल); ) ) प्राइवेट स्टैटिक फंक्शन StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"]।" /Log/Log.html"; $file = fopen($dir, "a"); झुंड($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s") ।"
║
" .PHP_EOL)); झुंड ($ फ़ाइल, LOCK_UN); fclose ($ फ़ाइल); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
यदि आप लोडिंग के लिए आने वाली कक्षाओं के नामों को देखते हैं, तो आप देखेंगे कि प्रत्येक कक्षा के पहले उपयोग में निर्दिष्ट नामस्थान से एक उपसर्ग लगा हुआ है। यही कारण है कि मैं नेमस्पेस के समान निर्देशिकाओं में फ़ाइलों के स्थान का उपयोग करने की अनुशंसा करता हूं; इससे खोज एक या दो पुनरावृत्तियों तक तेज हो जाती है।
अब हमारा सूचकांक इस प्रकार लिखा जा सकता है:
php
require_once "Autoloader.php";
use Autoloader as Autoloader;
use A\A as A;
use B\A as B;
use A\subA as sub
A::say();
A::say();
sub::say();
अब आपके द्वारा उपयोग की जाने वाली सभी कक्षाएं और इंटरफ़ेस स्वचालित रूप से लोड हो जाएंगे।
रिक्त स्थान के साथ भाषा की कुछ गतिशील क्षमताओं को प्रदर्शित करने के लिए, आइए एक और वर्ग घोषित करें:
परीक्षण.php
php
namespace mySpace
{
class test
{
__construct()
{
//конструктор;
}
function sayName($name)
{
echo "Привет " . $name;
}
static function sayOther()
{
echo "статичный вызов";
}
}
}
Index.php
php
require_once "Autoloader.php";
use Autoloader as Autoloader;
use mySpace\test as test
//можно, например сделать так
$class = "test";
//приведет к вызову конструктора
$obj = new $class;
$obj->कहोनाम("परीक्षण"); //या आप यह परीक्षण कर सकते हैं\sayName("test2"); //या इस तरह $obj::sayName("test"); //या आप यह परीक्षण कर सकते हैं::sayName("test2");
मुझे आशा है कि मेरा लेख किसी के लिए उपयोगी होगा।
(पीएचपी 5 >=5.3.0, पीएचपी 7)
नेमस्पेस के उपयोग पर चर्चा करने से पहले, यह समझना महत्वपूर्ण है कि PHP कैसे जानता है कि आपका कोड किस नेमस्पेस तत्व का अनुरोध कर रहा है। PHP नेमस्पेस और फ़ाइल सिस्टम के बीच एक सरल सादृश्य बनाया जा सकता है। फ़ाइल सिस्टम में फ़ाइल तक पहुँचने के तीन तरीके हैं:
- संबंधित फ़ाइल नाम जैसे foo.txt. इसका समाधान होता है currentdirectory/foo.txtजहां currentdirectory वर्तमान में व्याप्त निर्देशिका है। तो यदि वर्तमान निर्देशिका है /घर/फू, नाम का समाधान करता है /home/foo/foo.txt.
- सापेक्ष पथ नाम जैसे उपनिर्देशिका/foo.txt. इसका समाधान होता है currentdirectory/subdirectory/foo.txt.
- निरपेक्ष पथ नाम जैसे /main/foo.txt. इसका समाधान होता है /main/foo.txt.
- अयोग्य नाम, या बिना उपसर्ग वाला वर्ग नाम $a = नया foo();या foo::staticmethod(); वर्तमाननामस्थान, इसका समाधान होता है currentnamespace\foo फू. एक चेतावनी: यदि नामांकित फ़ंक्शन या स्थिरांक को परिभाषित नहीं किया गया है, तो फ़ंक्शंस और स्थिरांक के लिए अयोग्य नाम वैश्विक फ़ंक्शंस और स्थिरांक को हल कर देंगे। विवरण के लिए नेमस्पेस का उपयोग करना: वैश्विक फ़ंक्शन/स्थिरांक पर फ़ॉलबैक देखें।
- योग्य नाम, या पूर्वलग्न वर्ग नाम जैसे $a = नया उपनामस्थान\foo();या सबनेमस्पेस\foo::staticmethod();. यदि वर्तमान नामस्थान है वर्तमाननामस्थान, इसका समाधान होता है currentnamespace\subnamespace\foo. यदि कोड वैश्विक, गैर-नामस्थान वाला कोड है, तो इसका समाधान हो जाता है उपनामस्थान\foo.
- पूरी तरह से योग्य नाम, या वैश्विक उपसर्ग ऑपरेटर के साथ एक उपसर्ग नाम $a = नया \currentnamespace\foo();या \currentnamespace\foo::staticmethod();. यह हमेशा कोड में निर्दिष्ट शाब्दिक नाम का समाधान करता है, currentnamespace\foo.
यहां वास्तविक कोड में तीन प्रकार के सिंटैक्स का एक उदाहरण दिया गया है:
नेमस्पेस Foo\Bar\subnamespace;
स्थिरांक FOO = 1 ;
फ़ंक्शन फू()()
कक्षा फू
{
}
?>
नेमस्पेस Foo\Bar;
"file1.php" शामिल करें;
स्थिरांक FOO = 2;
फ़ंक्शन फू()()
कक्षा फू
{
स्थैतिक फ़ंक्शन staticmethod()()
}
/*अयोग्य नाम*/
फू(); foo::staticmethod(); इको फू;
/*योग्य नाम*/
उपनामस्थान\foo(); // Foo\Bar\subnamespace\foo कार्य करने का समाधान करता है
सबनेमस्पेस\foo::staticmethod(); // वर्ग Foo\Bar\subnamespace\foo का समाधान करता है,
// विधि staticmethod
इको सबनेमस्पेस\FOO; // निरंतर Foo\Bar\subnamespace\FOO का समाधान करता है
/* पूर्णतया योग्य नाम*/
\foo\bar\foo(); // Foo\Bar\foo कार्य करने का समाधान करता है
\foo\Bar\foo::staticmethod(); // वर्ग Foo\Bar\foo, विधि staticmethod को हल करता है
प्रतिध्वनि\Foo\Bar\FOO; // निरंतर Foo\Bar\FOO का समाधान करता है
?>
ध्यान दें कि किसी भी वैश्विक वर्ग, फ़ंक्शन या स्थिरांक तक पहुंचने के लिए, एक पूर्णतः योग्य नाम का उपयोग किया जा सकता है, जैसे \strlen()या \अपवादया \INI_ALL. ?>