2009-02-27 14 views
6

मैंने सुना है कि नवीनतम PHP नामस्थानों के लिए समर्थन है। मुझे पता है कि वैश्विक दायरे में परिभाषित चर नहीं नेमस्पेस है, तो कोई अलग नामस्थान में एक चर कैसे बना सकता है?नामस्थान क्या है और इसे PHP में कैसे कार्यान्वित किया जाता है?

क्या यह चर/कार्यों को वर्गीकृत करने का एक तरीका है?

उत्तर

24

नामस्थान चर, कार्य और कक्षाओं के आयोजन के लिए एक प्रोग्रामिंग भाषा तंत्र हैं।

कहो आप दो परियोजनाओं जो एक ही वर्ग के नाम का उपयोग उपयोगकर्ता गठबंधन करने के लिए चाहते हैं, लेकिन प्रत्येक के विभिन्न कार्यान्वयन है:

// Code for Project One (proj1.php) 
<?php 
    class User { 
    protected $userId; 
    public function getUserId() { 
     return $this->userId; 
    } 
    } 
    $user = new User; 
    echo $user->getUserId(); 
?> 

// Code for Project Two (proj2.php) 
<?php 
    class User { 
    public $user_id; 
    } 
    $user = new User; 
    echo $user->user_id; 
?> 

<?php 
    // Combine the two projects 
    require 'proj1.php'; 
    require 'proj2.php'; // Naming collision! 
    $myUser = new User; // Which class to use? 
?> 
पीएचपी 5.3 नामस्थान, जो मैं निम्न उदाहरण में प्रदर्शित करेंगे लिए समर्थन जोड़ता है

5 से कम PHP के संस्करणों के लिए।

<?php 
    class ProjectOne_User { 
    // ... 
    } 
    $user = new ProjectOne_User; // Code in Project One has to be changed too 
?> 

से अधिक PHP के संस्करणों या के लिए: 3, आप वर्ग उपयोगकर्ता परियोजनाओं में से एक के द्वारा प्रयोग किया एक नामकरण टक्कर को रोकने के लिए की सभी आवृत्तियों के लिए वर्ग के नाम बदलने की मुसीबत के माध्यम से जाने के लिए होता है

  • : अधिक जानकारी के लिए

    <?php 
        // Code for Project One (proj1.php) 
        namespace ProjectOne; 
        class User { 
        // ... 
        } 
        $user = new User; 
    ?> 
    
    <?php 
        // Combine the two projects 
        require 'proj1.php'; 
    
        use ProjectOne as One; // Declare namespace to use 
    
        require 'proj2.php' // No collision! 
    
        $user = new \One\User; // State which version of User class to use (using fully qualified namespace) 
    
        echo $user->user_id; // Use ProjectOne implementation 
    ?> 
    

    : 5.3 के बराबर है, तो आप नामस्थान एक परियोजना बनाते समय, एक नाम स्थान घोषणा जोड़कर उपयोग कर सकते हैं PHP.net Namespaces

  • PHP Namespaces
स्ट्रिंग सहायक कार्यों का एक समूह के लिए
+0

बहुत अच्छी तरह से सचित्र। +1 –

+0

सहमत हुए। बहुत अच्छा किया। मैं चाहता हूं कि वे नामस्थान और कक्षा के बीच एक अलग डिलीमीटर के साथ गए। :( –

+0

पूरे डेलीमीटर ग्रिपिंग के साथ: यह पूरी तरह ठीक काम करेगा यदि आप केवल एक उद्धृत तारों का उपयोग करते हैं जो मैं php में प्रत्येक स्ट्रिंग के लिए करता हूं, न्यूलाइन –

1

नामस्थान अक्सर लाइब्रेरीज़ के साथ उपयोग किए जाते हैं, लाइब्रेरी कोड को 1 सिंगल नेमस्पेस के साथ संदर्भित करने की क्षमता पहले से उपयोग किए जा रहे अन्य लोगों को पकड़ने में मदद नहीं करती है।

3

namespace आपको कोड व्यवस्थित करने की अनुमति देता है और आपको अपने आइटम को समाहित करने का तरीका देता है।

आप नेमस्पेस को विज़ुअलाइज़ कर सकते हैं क्योंकि फाइल सिस्टम संबंधित फाइलों में निर्देशिकाओं का उपयोग करता है।

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

वे आपके PHP कक्षाओं/कार्यों/स्थिरांक के बीच नाम टकराव से बचने में मदद करते हैं, और कोड पठनीयता में सुधार करते हैं, अतिरिक्त लंबी कक्षा के नामों से परहेज करते हैं।

उदाहरण नाम स्थान घोषणा:

<?php 
namespace MyProject; 

const CONNECT_OK = 1; 
class Connection { /* ... */ } 
function connect() { /* ... */ } 

?> 
+0

तो, मैं एक कक्षा में स्थिर कार्यों से बाहर उन्हें मिलता है और नाम स्थान स्ट्रिंग करना चाहिए; फ़ंक्शन मैच() {} आदि? टिप्पणियों और कोड के साथ – alex

3

नेमस्पेस टकराव नामकरण जब पुस्तकालयों से वर्गों और कार्यों का आयात की समस्या का समाधान।

नामस्थानों के बिना, यदि आप दो पुस्तकालयों को शामिल करते हैं जो एक ही नाम के साथ फ़ंक्शन/कक्षा को परिभाषित करते हैं (यानी, दो पुस्तकालय जिनमें दोनों 'उपयोगकर्ता' नामक कक्षा शामिल होती है), यह असफल हो जाएगी।

PHP में कोई नेमस्पेस समर्थन नहीं होने के कारण, अधिकांश पुस्तकालयों ने नाम टकराव से बचने के प्रयास में अद्वितीय होने की संभावना के साथ अपने कार्य/वर्ग नामों को उपसर्ग करने के लिए लिया है। समस्या यह है कि यह लंबे कार्य या कक्षा के नाम बनाता है।

उदाहरण here दिया अपवाद वर्ग के है:

PEAR_Form_Loader_Validate_Table_Element_Validator_Exception. 

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

निम्नलिखित ज़ेड :: डीबी :: कनेक्शन के लिए डीबीकनेक्शन नामक 'उपनाम' लागू होता है।

use Zend::DB::Connection as DbConnection 
संबंधित मुद्दे