2012-11-12 4 views
7

नाशपाती और ज़ेड की छद्म नेमस्पेसिंग पैटर्न का उपयोग करते समय वर्ग heirarchies कि इस तरह दिखेगा के पार चलो के लिए आम है Zend_Db_Expr। हालांकि, जब आप पुराने 5.2 psuedo नेमस्पेसिंग को PHP 5.3 नेमस्पेसिंग में कनवर्ट करने का प्रयास करते हैं तो आपको ऐसे मामले के साथ प्रस्तुत किया जाता है जहां नामस्थान और कक्षा एक नाम साझा करती है। चूंकि उपयोग ऑपरेटर या तो नामस्थान या क्लासनाम आयात कर सकता है, इससे अस्पष्टता होती है।क्या होता है जब नामस्थान और वर्ग PHP में नाम साझा करते हैं?</p> <pre><code>Zend/ Db.php Db/ Expr.php </code></pre> <p>कहाँ db.php एक वर्ग <code>Zend_Db</code> और नाम शामिल Expr.php एक वर्ग नामित शामिल हैं:

यहाँ एक एप्लिकेशन मैं काम कर रहा हूँ का एक उदाहरण है परिवर्तित करने पर:

App/ 
    Core.php 
    Core/ 
     Autoloader.php 

यहाँ आधार निर्देशिका और नाम स्थान अनुप्रयोग है।

namespace App; 
class Core { } 

कोर निर्देशिका में विभिन्न अन्य कोर कक्षाएं, जिनमें से कुछ मुख्य Core का उपयोग कर रहे हैं: नाम अंतरिक्ष के शीर्ष स्तर में एक Core वर्ग है। छद्म नामस्थान पैटर्न के तहत, यह कोई समस्या नहीं है। लेकिन वास्तविक नामस्थान पैटर्न में यह इस स्थिति को बनाता है:

namespace App\Core; 
use App\Core as Core; // What is this importing? Namespace or class? 

class Autoloader { 
    public function __construct(Core $core) {} 
} 

क्या यह परिभाषित किया गया है? वास्तव में यहां क्या आयात किया जाता है?

+0

समस्या क्या है? मुझे नहीं लगता था कि आप एक नामस्थान आयात कर सकते हैं। आप हमेशा एक कक्षा आयात कर रहे हैं और इसे सिर्फ उपनाम दे रहे हैं। –

+2

http://php.net/manual/en/language.namespaces.importing.php उपयोग एक वर्ग या नामस्थान आयात कर सकते हैं। –

उत्तर

1

बस दोनों। यह असली आयात नहीं है, केवल कंपाइलर के लिए एक संकेत है कि इस उपरोक्त वर्ग के संचालन में इस उपनाम के हर मुठभेड़ को इस घोषणा में विस्तारित किया जाना चाहिए। PHP नामस्थान में केवल कक्षा का हिस्सा है, इसलिए बस इस बारे में सोचें

$alias = 'Zend_Db'; 
$zendDB = new $alias; 
$aliasExpr = $alias . '_Expr'; 
$expr = new $aliasExpr; 
संबंधित मुद्दे