2011-12-22 9 views
10

में नेमस्पेस का उपयोग करने का एक अच्छा तरीका है, मैंने कुछ समय पहले PHP में नेमस्पेस के उपयोग का अध्ययन किया है, लेकिन हाल ही में use कीवर्ड का उपयोग करने वाली एक परियोजना को देख रहा है और फिर नेमस्पेस्ड ऑब्जेक्ट तक पहुंच गया है जैसे कि वे नामस्थान के बिना सामान्य थे।क्या यह PHP

मेरा प्रश्न है, सही नीचे कोड है, यह एक फ़ाइल index.php एच एस और नाम स्थान MyLibrary\Base यह तो use का उपयोग करता है में लाने के लिए उपयोग करता \MyLibrary\Registry\MyLibrary\User और \MyLibrary\Request

यह तो वहाँ डाले बिना इन वस्तु के किसी भी उपयोग कर सकते हैं उनके सामने नेमस्पेस, इसलिए use सेक्शन का वास्तविक कोड सामान्य प्री-नेमस्पेस PHP फ़ाइल जैसा दिखता है।

मैं पूछ रहा हूं कि आप नामस्थानों का उपयोग कैसे करते हैं? या क्या मैं कुछ न कुछ भूल रहा हूं?

फ़ाइल: index.php

<?php 
namespace MyLibrary\Base; 

use \MyLibrary\Registry; 
use \MyLibrary\User; 
use \MyLibrary\Request; 


class Base 
{ 
    public $registry; 

    function __construct($registry) 
    { 
     $this->registry = $registry; 
     $this->user = New User; 
     $this->request = new Request; 
     # code... 
    } 
} 
?> 

फ़ाइल: registry.class.php

<?php 
namespace MyLibrary\Registry; 

class Registry 
{ 
    public $user; 

    function __construct($user) 
    { 
     $this->user = $user; 
     # code... 
    } 
} 
?> 

उत्तर

5

हां। use -स्टेटमेंट कक्षा-या नामस्थान-नाम को वर्तमान दायरे में आयात करता है।)

namespace MyFirstNamespace { 
    class Foo {} 
} 
namespace MySecondNamespace { 
    use \MyFirstNamespace\Foo as Bar; 
    $foo = new Bar; 
} 

क) यह सब कुछ अधिक पठनीय बनाने के लिए, क्योंकि इसके बहुत कम, Vendor_Package_Foo_Bar_XyzClass से और ख) आप कक्षाओं का आदान-प्रदान का उपयोग करने के कर सकते हैं, सब कुछ है कि कम कारण, क्यों पीएचपी-devs नामस्थान लागू किया है लिखने के लिए बहुत तेज़।

# use \MyFirstNamespace\Foo as Bar; // I don't like Foo anymore 
use \MyFirstNamespace\SimilarToFoo as Bar; 
+1

यह आश्चर्यजनक है और अब मैं नामों का उपयोग करना चाहता हूं, इससे पहले कि मैं वास्तव में नहीं चाहता था क्योंकि मैंने सोचा था कि मुझे अपने पूरे कोड में बुराई दिखने वाला \\ 'विभाजक से निपटना होगा। यह मुझे पाइथन की याद दिलाता है, जिस तरह से आपको पुस्तकालयों को आयात करना है – JasonDavis

+0

असल में मुझे कहना चाहिए कि यह सी # की तरह है जहां वे सिस्टम का उपयोग कर रहे हैं ... 'सिस्टम का उपयोग कर।' सिस्टम का उपयोग कर। चयन। जेनरिक; 'आदि ... मैं बस यह नहीं पता था कि वे नेमस्पेस आयात कर रहे थे। मैं यह भी देख सकता हूं कि यह एनएस विभाजक के रूप में एक बिंदु/अवधि के साथ कितना अच्छा लगेगा। – JasonDavis

+0

एक त्वरित सवाल, जैसे आपने 'मेरा \ NFirstNamespace \ Foo को बार के रूप में उपयोग किया है;' मुझे पता है कि आप इस तरह का नाम बदल सकते हैं लेकिन मैंने जो कोड देखा है, उन्होंने इसे मेरे उदाहरण की तरह किया है ... 'उपयोग \ MyFirstNamespace \ Foo ; 'और फिर' Foo' का उपयोग कर एक्सेस करें क्या यह संभव है? ध्यान दें कि मैंने सेट नहीं किया है और कुछ भी है या क्या आपको इसे 'उपयोग \ MyFirstNamespace \ Foo को Foo के रूप में सेट करना होगा;'? – JasonDavis

3

नेमस्पेसिंग इसे करने के लिए फायदे का एक बहुत है।

पहला यह है कि आप विधि नामों और यहां तक ​​कि कक्षा के नामों का पुन: उपयोग कर सकते हैं यदि यह समझ में आता है कि वे एक अलग नामस्थान के भीतर मौजूद हैं। उदाहरण:

namespace \myNamespace\data\postgres; 

class DataBase extends \PDO 
{ 
} 

namespace \myNamespace\data\mysql; 

class DataBase extends \PDO 
{ 
} 

तुम भी एक साथ नामकरण के बारे में चिंता किए बिना ऐसे नाम हैं जो सामान्य रूप से PHP कार्यों के लिए आरक्षित हैं

namespace \myNamespace\dir; 

function makedir() 
{ 
    if (// some condition is true) 
    { 
     \makedir(); 
    } 
} 

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

उदाहरण मैं \ Gordian सभी कोड मैं लिखने में उपयोग जड़ नाम स्थान के रूप में, जैसा कि मैंने तो उस नाम स्थान कुछ भी मैं के बारे में उन्हें कोई है जो एक अलग जड़ नाम स्थान चुना है के साथ टकराने में चिंता किए बिना चाहते तहत मेरी कक्षाओं के लिए कॉल कर सकते हैं

तो पीयर सम्मेलनों के साथ क्या गलत है, आप पूछ सकते हैं? लोकप्रिय ज़ेंड ढांचे सहित कई परियोजनाएं उनका पालन करती हैं।

जवाब नाम बहुत जल्दी बहुत भारी-भरकम हैं है। उदाहरण के लिए, ज़ेंड, जैसा कि यह पियर सम्मेलन का पालन करता है, एक छद्म नाम-नाम का उपयोग करता है। संग्रह में सभी वर्ग Zend_ के साथ शुरू होते हैं और प्रत्येक श्रेणी के वर्ग पदानुक्रम के साथ नाम पर एक और हिस्सा जोड़ते हैं।
ज़ी परिणामस्वरूप, आप Zend_Db_Adaptor_Abstract और Zend_Dojo_Form_Decorator_TabContainer जैसे क्लास नामों के साथ समाप्त होते हैं।

क्या ज़ेंड को नामस्थानों का उपयोग करने के लिए अपने ढांचे को अद्यतन करना चाहिए (जो मुझे बताया गया है कि ज़ेंड फ्रेमवर्क 2.0 के साथ हो रहा है) तो उन्हें \ Zend \ Db \ Adapter \ सार और \ Zend \ Dojo \ Form \ Decorator \ इसके बजाय TabContainer। तो क्या, आप पूछ सकते हैं? जवाब यह है कि आप उन्हें उपयोग किए गए कीवर्ड के साथ बहुत छोटे नामों के साथ उपनाम कर सकते हैं, जैसा कि आपने पहले ही देखा है। इसका मतलब है कि आपको पूर्ण श्रेणी का नाम लिखना नहीं है, लेकिन केवल आपके द्वारा उपरोक्त किए गए कार्यों के लिए।

use \Zend\Dojo\Forn\Decorator as Dec; 

$a = new Dec\TabContainer; // Not easy to do without namespaces! 

इसके अलावा अधिक, यदि आप किसी दिए गए नाम स्थान में पहले से ही कर रहे हैं, तो आप भी एक छोटी नाम से एक ही नाम स्थान के भीतर अन्य मदों का उपयोग करने के उपयोग कीवर्ड का उपयोग करने के, की जरूरत नहीं है के रूप में यह करने के लिए अपने आप होता है आप उस मामले में। ढांचे लेखकों के लिए यह एक बड़ा टाइमवेवर है।

उदाहरण के लिए, आप Zend फ्रेमवर्क 2 में followign की तरह कुछ देख सकता है (के रूप में मैं किसी भी तरह से इस पर काम कर नहीं कर रहा हूँ, यह विशुद्ध रूप एक उदाहरण है और वास्तविक ZF2 स्रोत से नहीं)।

namespace \Zend\Db\Adaptor; 

class Postgres extends Abstract // We don't need to use \Zend\Db\Adaptor\Abstract here because it's in the same namespace already anyway 
{ 
} 

वहाँ अन्य लाभ भी हैं, इस तरह के रूप में यह autoloaders हास्यास्पद बनाने के लिए सरल बना देता है (आपका नाम स्थान संरचना प्रदान की अपनी फाइल सिस्टम निर्देशिका संरचना पर बिल्कुल नक्शे)।

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

संबंधित मुद्दे