2011-07-20 16 views
8

मुझे पिछले कर्मचारी द्वारा लिखे गए एक PHP वर्ग का सामना करना पड़ा जो इस तरह परिभाषित किया गया है:कक्षा खुद को विस्तारित कर रही है?

namespace SomeNamespace; 

class SomeClass extends ::SomeClass 
{ 
    private function __construct() {} 

    public static function someFunction() 
    { 
     //Do something 
    } 
} 

क्या कोई कृपया यहां बताएगा कि क्या हो रहा है? क्या यह वर्ग खुद को विस्तारित कर रहा है? मुझे पता है कि एक सिंगलटन एक निजी कन्स्ट्रक्टर का उपयोग करेगा, लेकिन यह सुनिश्चित नहीं है कि यहां क्या हो रहा है।

वास्तविक वर्ग को कैशिंग के साथ करना है। यकीन नहीं है कि अगर मदद करता है।

+2

क्या यह त्रुटियों के बिना निष्पादित करता है? और क्या आप सुनिश्चित हैं कि दोनों वर्ग एक ही नामस्थान में हैं? – zzzzBov

+2

अच्छा सवाल! पहले कभी ऐसा कोड नहीं देखा। या तो पिछला कर्मचारी एक प्रतिभाशाली था, या एक पागल व्यक्ति था। – GordonM

+0

मैं इस समय कक्षा को निष्पादित करने में अनिच्छुक हूं। लेकिन हां!एक रेखा है जो कक्षा परिभाषा के ऊपर एक नामस्थान परिभाषित करती है (मैंने इसे प्रतिबिंबित करने के लिए प्रश्न अपडेट किया है)। –

उत्तर

6

मुझे नहीं लगता कि आप :: का उपयोग करके इस तरह की चीज कर सकते हैं; लेकिन यदि आप नाम स्थान विभाजक उपयोग कर रहे हैं काम करना चाहिए: \

मैं सिर्फ पीएचपी पीएचपी 5.3.5 के साथ परीक्षण किया - और :: का उपयोग कर वास्तव में मुझे कोई त्रुटि मिलती है।
दूसरी ओर, \ 0 का उपयोग कर ठीक है (नीचे उदाहरण देखें)


उदाहरण के लिए , (किसी भी विशिष्ट नाम स्थान के बाहर) आप एक वर्ग SomeClass निर्धारित कर सकते हैं ग्लोबल नेम स्पेस में किया जा रहा: एक विशिष्ट नाम स्थान मेरी उदाहरण में SomeNamespace बुलाया में

namespace { 

    class SomeClass 
    { 
     public function method() { 
      var_dump("child: " . __METHOD__); 
     } 
    } 


    $obj = new SomeNamespace\SomeClass(); 
    $obj->method(); 

} 


और, , आप कक्षा SomeClass को परिभाषित कर सकते हैं जो वैश्विक नामस्थान से कक्षा का विस्तार करेगा - जो \SomeClass:

के रूप में सुलभ है


Sidenote: - लेकिन यह होना चाहिए यहाँ, मैं bracketed syntax उपयोग करते हैं, के रूप में मैं एक ही फाइल में कोड की दो भागों डाल रहा हूं है (कि मैनुअल पृष्ठ पर उदाहरण 3 देखें) कई फाइलों के साथ ही काम करें।



ध्यान दें कि पीएचपी 5.3 के पहले अल्फा संस्करण के साथ, नाम स्थान विभाजक \ नहीं था, लेकिन ::

तो, आप PHP 5.3 अल्फा 1 या 2 (प्रयोग कर रहे हैं और शायद 3, सुनिश्चित नहीं है कि \ को अल्फा से पहले या उसके बाद चुना गया है 3), :: का उपयोग कर काम कर सकता है।

(बेशक, आप एक अल्फा का उपयोग नहीं किया जाना चाहिए - विशेष रूप से विचार कर रहा है कि वहाँ अब दो साल के लिए पीएचपी 5.3 की स्थिर संस्करणों रहे हैं)

+0

हां! हम PHP का अल्फा संस्करण चला रहे हैं। हमें अब इसके बारे में टिप्पणी करने की आवश्यकता नहीं है :-) –

+2

एर्ग, आप वास्तव में वास्तव में वास्तव में अल्फा पर नहीं चलना चाहिए - खासकर ऐसे पुराने! जिस दिन आप एक स्थिर संस्करण में स्विच करते हैं, आपका सभी नेमस्पेस कोड टूट जाएगा ... * (क्षमा करें, मैं टिप्पणी करने का विरोध नहीं कर सकता ^^ ग्लैड मैं मदद कर सकता हूं, हालांकि) * –

+0

हाहा हाँ यह भयानक है! –

2

मैं सही ढंग से 5.3 के विकास के दौरान याद कर रहा हूँ तो :: नामस्थान विभाजक के रूप में उपयोग किया गया था।

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