2012-02-24 15 views
5

PHP में नेमस्पेसिंग मैं यह पता लगाने की असली एक साथ समूहीकृत पुस्तकालय वस्तुओं और एक ही वर्ग के नाम का फिर से उपयोग होने के अलावा अन्य लाभ क्या हैं कोशिश कर रहा हूँ के बारे में कुछ शोध करने के बाद।पीएचपी नेमस्पेसिंग लाभ

मुझे नामस्थानों के बारे में क्या पसंद नहीं है, वे फ़ाइल के शीर्ष पर इन अतिरिक्त लाइनें हैं जिन्हें आप 'कोर कोर \ जो भी \ क्लास' से कक्षाओं को कॉल कर रहे हैं, जिन्हें आपको मानक दृष्टिकोण से नहीं करना है ।

इसके अलावा - कुछ मैं के बारे में जानकारी भी नहीं मिला - क्या स्थिति है जहाँ हम ही नाम के दो वर्गों के उपयोग करने की आवश्यकता में होता है, लेकिन में भिन्न फ़ोल्डर है, जो एक ही विधि का नाम शामिल? हमें अभी भी नेमस्पेस को कॉल करना होगा, लेकिन कोड कैसे पता लगाएगा कि किस वर्ग से किस वर्ग का उपयोग किया जाना चाहिए?

मैं सिर्फ नामस्थान के साथ शुरू कर दिया है तो मुझे क्षमा करें यदि इस सवाल का बहुत ही बुनियादी ध्वनि करने के लिए लग रहे हैं।

इसके अलावा - यह स्थिर तरीकों से कैसे काम करता है - उदाहरण के लिए हेल्पर क्लास जैसी चीजें - क्या मुझे यह भी संकेत देना होगा कि मुझे इस नेमस्पेस का उपयोग कोर \ जो भी \ हेल्पर 'चाहिए?

+3

उत्तर सरल है: अस्पष्टता को सीमित या समाप्त करने के लिए, अपने कोड बेस को बेहतर संरचना प्रदान करने के लिए। PHP में ओओपी अवधारणाओं को रखने में तार्किक कदमों में से एक के रूप में इसके बारे में सोचें। –

+2

आपको 'उपयोग' का उपयोग करने की आवश्यकता नहीं है। आप कक्षाओं को अपने पूर्ण-योग्य नाम जैसे 'new \ core \ whatever \ class' के साथ हमेशा कॉल कर सकते हैं। हालांकि, आप सबसे बड़ा लाभ याद करेंगे: पठनीयता। अपने अन्य प्रश्नों (विशेष रूप से नाम विवाद) के संबंध में, http://php.net/language.namespaces – KingCrunch

+0

(2 में से 1) पढ़ें, मेरे पास एक ही प्रश्न है। मैं विभिन्न नामों में अलग-अलग नामों के साथ अलग-अलग वर्गों को रखने में सक्षम होने के लाभ को समझता हूं। लेकिन यह एकमात्र लाभ है जिसे मैं देखता हूं और यह एक बड़ी कीमत पर आता है। यदि मुझे आवश्यक विभिन्न ऑब्जेक्ट्स बनाने के लिए मुझे पीएचपी क्लास फ़ाइल की शुरुआत में एक्स यूएसई स्टेटमेंट्स लिखना होगा, तो एक्स एक्स कथन का उपयोग करने से यह अलग कैसे है। – andypotter

उत्तर

12

आप कई वर्गों के साथ एक बड़ी परियोजना है, तो आप अंत में नामकरण संघर्ष में चलाने की जाती है। आप एक db/mysql/adapter.php और एक http/curl/adapter.php है। नामस्थान के बिना इस समस्या से निपटने के लिए, आपको Db_Mysql_Adapter और Http_Curl_Adapter की तरह अपनी कक्षाओं अद्वितीय नामों देने के लिए है, और किसी भी समय आप इन कक्षाओं का उल्लेख आप अपने पूरे नाम का उपयोग करने की आवश्यकता है।

नेमस्पेस आप अपनी कक्षाओं Db\Mysql\Adapter और Http\Curl\Adapter नाम और उन्हें बस अन्य नामस्थान में क्रमश: उनके स्थानीय नाम स्थान, या Mysql\Adapter और Curl\Adapter में Adapter से उल्लेख करने के लिए अनुमति देते हैं। यह एक बहुत टाइपिंग की बचा सकता है।

अंतर देखने के लिए ज़ेंड फ्रेमवर्क version 1 बनाम version 2 के स्रोत से ब्राउज़ करें।

क्या स्थिति है जहाँ हम ही नाम के दो वर्गों के उपयोग करने की आवश्यकता में होता है, लेकिन में भिन्न फ़ोल्डर है, जो एक ही विधि का नाम शामिल? हमें अभी भी नेमस्पेस को कॉल करना होगा, लेकिन कोड कैसे पता लगाएगा कि किस वर्ग से किस वर्ग का उपयोग किया जाना चाहिए?

आप नाम स्थान Db\Mysql में हैं, Adapter::foo() संदर्भित करता है Db\Mysql\Adapter और \Http\Curl\Adapter::foo() एक दूसरे को उल्लेख करता है।

namespace Db\Mysql; 
use Http\Curl\Adapter as HAdapter; 

Adapter::foo(); // Mysql adapter 
HAdapter::foo(); // Http adapter, same as: 
\Http\Curl\Adapter::foo(); 
+0

धन्यवाद धोखा - यह वास्तव में बहुत मदद करता है। – user398341

1

मैं नामस्थान के बारे में क्या पसंद नहीं है इन अतिरिक्त लाइनें हैं: आप अपने फ़ाइल के शीर्ष पर वर्ग उर्फ, आप नहीं पूरे नाम हर समय बाहर लिखना चाहते हैं कर सकते हैं अगर फ़ाइल के शीर्ष पर आप कक्षाओं को 'कोर कोर \ जो भी \ क्लास' से कॉल कर रहे हैं, जिसे आपको मानक दृष्टिकोण से नहीं करना है।

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

क्या स्थिति है जहाँ हम ही नाम के दो वर्गों के उपयोग करने की आवश्यकता में होता है, लेकिन में भिन्न फ़ोल्डर है, जो एक ही विधि का नाम शामिल? हमें अभी भी नेमस्पेस को कॉल करना होगा, लेकिन कोड कैसे पता लगाएगा कि किस वर्ग से किस वर्ग का उपयोग किया जाना चाहिए?

नेमस्पेसिंग aliases का उपयोग करके इन मुद्दों को रोकता है। इसके अलावा, एक ही नाम के साथ कक्षाएं हैं? जब तक कि वे एक ही नाम नहीं हैं लेकिन अलग-अलग उद्देश्य या अलग-अलग उपश्रेणी हैं, जैसे api.document.events और api.ajax.events। अन्यथा, यह खराब प्रोग्राम डिजाइन है।

0

यह उत्तर @deceze के उत्तर पर केंद्रित है।

उनका तर्क यह है कि विभिन्न नामों के साथ दो कक्षाएं अधिक जटिल हैं। क्या यह?

1.) उनका उदाहरण कोड काम नहीं करता है क्योंकि उन्होंने फ़ाइलों को कभी भी शामिल नहीं किया है। तो यह इस तरह दिखना चाहिए: गैर

<?php 
// this is Db/Mysql/Adapter.php 

namespace Db/Mysql; 

class Adapter { 
    static function foo() { 
    } 
} 

?> 

और अब:

namespace Db\Mysql; 
use Http\Curl\Adapter as HAdapter; 

include('Db/Mysql/Adapter.php'); 
include('Http/Curl/Adapter.php'); 

Adapter::foo(); // Mysql adapter 
HAdapter::foo(); // Http adapter, same as: 
\Http\Curl\Adapter::foo(); 

2.) जब तक adapter.php फ़ाइलों को शामिल नहीं कर सकते हैं, भी इस फ़ाइलों के लिए नाम स्थान परिभाषा में शामिल न करें -namespace संस्करण:

include('db/mysql/adapter.php'); 
include('http/curl/adapter.php'); 

MysqlAdapter::foo(); // Mysql adapter 
CurlAdapter::foo(); // Http adapter 

एक adapter.php इस तरह दिखना चाहिए:

<?php 
// this is Db/Mysql/Adapter.php 

class MysqlAdapter { 
    static function foo() { 
    } 
} 

?> 

अंत में आपको पहले जितनी अधिक फाइलें संपादित करने की आवश्यकता है, पहले जैसा कोड जोड़ना होगा। तो यह तर्क नहीं हो सकता है।

एकमात्र तर्क जो अस्तित्व में हो सकता है यह है कि आप विरोधाभासी third party libraries के साथ समस्याओं से बचें। लेकिन अतीत में आपके पास कितने नाम विवाद थे? और आप कितने पुस्तकालयों को जानते हैं कि नामस्थान का उपयोग करें ताकि आपको सभी फ़ाइलों को संपादित करने की आवश्यकता न हो?

तथ्य यह है कि असली दुनिया में लाभ नहीं है। यह सी दुनिया से कुछ अपनाया गया है जो मेरी राय में लाभों से अधिक भ्रमित जोड़ता है।