2011-01-16 7 views
13

मैं अपने phpDoc में "वर्तमान वर्ग का उदाहरण देता हूं" के रूप में एक विधि को कैसे चिह्नित करूं?

निम्नलिखित उदाहरण में मेरा आईडीई (नेटबीन्स) उस सेट को देखेगा कुछ हमेशा foo ऑब्जेक्ट देता है।

लेकिन वह सच नहीं है अगर मैं हद वस्तु - यह $this वापस लौटा देंगे, दूसरे उदाहरण में एक bar वस्तु नहीं एक foo वस्तु है।

class foo { 
    protected $_value = null; 

    /** 
    * Set something 
    * 
    * @param string $value the value 
    * @return foo 
    */ 
    public function setSomething($value) { 
     $this->_value = $value; 
     return $this; 
    } 
} 

$foo = new foo(); 
$out = $foo->setSomething(); 

तो ठीक - setSomething एक foo रिटर्न - लेकिन निम्न उदाहरण में, यह एक bar रिटर्न ..:

class bar extends foo { 
    public function someOtherMethod(){} 
} 

$bar = new bar(); 
$out = $bar->setSomething(); 
$out->someOtherMethod(); // <-- Here, Netbeans will think $out 
         // is a foo, so doesn't see this other 
         // method in $out's code-completion 

... यह मेरे लिए के रूप में इस का समाधान करने के लिए महान हो जाएगा, कोड पूर्णता एक बड़े पैमाने पर गति-बढ़ावा है।

किसी को भी एक चतुर चाल, या इससे भी बेहतर, phpDoc के साथ दस्तावेज़ करने का एक उचित तरीका मिला है?

+2

यह नेटबीन की गलती होगी, क्योंकि PHP में कोई ऑब्जेक्टिंग और डाउनकास्टिंग ऑब्जेक्ट नहीं है। – BoltClock

+0

मुझे लगता है कि यह शायद उत्तर के सबसे नज़दीक है (यानी मैं कुछ भयानक समझौता किए बिना ऐसा नहीं कर सकता)। मुझे लगता है कि जावा में मुझे 'setSomething'' के परिणाम को 'बार' पर नतीजा देना होगा इससे पहले कि मैं उस पर 'someOtherMethod' का उपयोग कर सकूं। – ledneb

उत्तर

5

सोचा कि मैं इस क्यू पर फिर से विचार करूंगा क्योंकि मैं कुछ चीजों में आया था।

वर्तमान में "$ यह वापस करें" समर्थित नहीं है, लेकिन एक phpDoc अनुरोध है जो वास्तव में v1 में जोड़ने के लिए है।5:

http://pear.php.net/bugs/bug.php?id=16223

वहाँ भी ग्रहण पीडीटी में इसके लिए एक अनुरोध है:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=276082

दोनों अपेक्षाकृत पुराने अनुरोध कर रहे हैं। मैं जल्द ही इसे किसी भी समय लागू करने के बारे में बहुत उत्साहित नहीं होने वाला हूं, लेकिन यहां उम्मीद करने के लिए जाता है :) इस बीच, ऐसा लगता है कि इस समस्या का कोई उचित समाधान नहीं है।

1

यहाँ 3 काम के आसपास है: (ये सिर्फ आस-पास काम कर रहे हैं नहीं बनी होनी चाहिए और लागू कक्षाएं एक IDE के व्यवहार पर मुकदमा करने की।)

विकल्प 1: विधि अमूर्त या खाली someOtherMethod बनाने foo कक्षा में विधि

class foo implements ifoo { 
    protected $_value = null; 

    /** 
    * Set something 
    * 
    * @param string $value the value 
    * @return ifoo 
    */ 
    public function setSomething($value) { 
     $this->_value = $value; 
     return $this; 
    } 

    // abstract method or create empty method if you want the method to be 
    // to be optional 
    abstract function someOtherMethod(); 
} 

विकल्प 2:

अवहेलना विधि से बार कक्षा में tSomething

class bar extends foo { 
    /** 
    * 
    * @param <type> $value 
    * @return bar 
    */ 
    public function setSomething($value) { 
     return parent::setSomething($value); 
    } 

    public function someOtherMethod(){} 
} 

विकल्प 3: उपयोग इंटरफ़ेस

interface ifoo { 
    public function someOtherMethod(){} 
} 

class foo { 
    protected $_value = null; 

    /** 
    * Set something 
    * 
    * @param string $value the value 
    * @return ifoo 
    */ 
    public function setSomething($value) { 
     $this->_value = $value; 
     return $this; 
    } 
} 

class bar extends foo implements ifoo { 

    public function someOtherMethod(){} 
} 
+0

विकल्प 2 शायद यहां सबसे अच्छा विचार है, लेकिन जैसा कि आप कहते हैं, वे सभी कार्य-आसपास हैं, जिसमें बेस क्लास बदलते समय विस्तारित कक्षाओं को बदलना शामिल है। मुझे लगता है कि सच यह है कि मैं नेटबीन्स/phpDoc की सीमा है। यह कहना मुश्किल है कि यह नेटबीन्स की गलती है क्योंकि phpDoc स्पष्ट रूप से कहता है कि यह 'foo' देता है। शायद कुछ प्रकार के '@return $ this' वाक्यविन्यास अच्छा होगा ..? : -एस – ledneb

1

phpDoc syntax allows for multiple types to be defined by separating them with a | character for the @return tag। जब आप class bar के साथ बढ़ाते हैं तो आपको एक नया phpDoc टैग लिखना चाहिए जिसमें @return के लिए उचित कक्षा हो।

यदि कोई फ़ंक्शन foo या bar देता है तो आप @return foo|bar का उपयोग करेंगे।

हालांकि आपके मामले में ओवरराइड फ़ंक्शन के लिए @return bar को परिभाषित करें।

देखभाल करें।

+0

दरअसल - लेकिन मैं सेट नहीं करना चाहूंगा 'foo' में कुछ को' @return foo | bar | हर-दूसरे-विस्तार-वर्ग 'के रूप में दस्तावेज किया जाना चाहिए। मैं उम्मीद कर रहा था कि प्रत्येक सबक्लास के लिए phpDoc को फिर से लिखना पड़ेगा लेकिन ऐसा लगता है कि आईडीई समझने का एकमात्र तरीका होगा। – ledneb

8

अद्यतन:

Netbeans 7.4 के रूप में, आईडीई @return स्वयं, स्थिर का समर्थन करता है, और यह (http://wiki.netbeans.org/NewAndNoteworthyNB74#Editor_2)।

class foo { 
    protected $_value = null; 

    /** 
    * Set something 
    * 
    * @param string $value the value 
    * @return this 
    */ 
    public function setSomething($value) { 
     $this->_value = $value; 
     return $this; 
    } 
} 

class bar extends foo { 
    public function someOtherMethod(){} 
} 

पिछला उत्तर:

हम एक रिकार्ड इटरेटर के current() विधि के साथ एक ऐसी ही समस्या है। चूंकि इटेटर को कई अलग-अलग वर्गों के लिए बढ़ाया गया है, इसलिए यह @return $class से जुड़ा हुआ नहीं है। हमने पहले @ satrun77 के विकल्प 2 का उपयोग किया है, लेकिन मैंने नेटबीन्स में कुछ सफलता के साथ @method का उपयोग किया है।

class foo { 
    protected $_value = null; 

    /** 
    * Set something 
    * 
    * @param string $value the value 
    * @return foo 
    */ 
    public function setSomething($value) { 
     $this->_value = $value; 
     return $this; 
    } 
} 

/** 
* @method bar setSomething($value) 
*/ 
class bar extends foo { 
    public function someOtherMethod(){} 
} 
+0

सौभाग्य से, उन लोगों के लिए जिन्होंने अभी भी ज्ञात फ़ॉन्ट प्रतिपादन समस्या के कारण 7.4 की ओर छलांग नहीं बनाई है, यह वाक्यविन्यास Netbeans 7.3.1 में भी काम करता है। –

+0

क्या इस तरह की वापसी के रूप में 'यह [] 'कुछ करने का कोई तरीका है? – tcigler