2012-12-09 13 views
15

चलें कहते हैं कि मैं एक समारोह (स्पष्ट रूप से एक छोटी सी उदाहरण है):डॉकब्लॉक में असीमित पैरामीटर कैसे घोषित करें?

public function dot(){ 
    return implode('.', func_get_args()); 
} 

अब मुझे पता है मैं को संशोधित कर सकता है यह होने के लिए

public function dot(array $items){ 
    return implode('.', $array); 
} 

लेकिन कुछ कार्यों कि एक विकल्प नहीं है के साथ। तो, आप डॉकब्लॉक के साथ फ़ंक्शन के पहले संस्करण को कैसे दस्तावेज़ित करेंगे ताकि आईडीई व्याख्या कर सके कि यह असीमित पैरामीटर प्राप्त कर सकता है?

/** 
* Joins one or more strings together with a . (dot) 
* @param string $string1 
* @param string $string2 
* @param string $_ [optional] 
* @return string 
*/ 
public function dot($string1, $string2, $_ = null) { 
    return implode('.', func_get_args()); 
} 

एक IDE में कौन सा तरह autocomplete example

लग रहा है लेकिन यह मेरे लिए एक हैक की तरह लगता है, वहाँ यह करने के लिए सिर्फ docBlock साथ कोई रास्ता नहीं है:

मैं कुछ तरीकों का उपयोग करने वाले को देखा है?

उत्तर

2

PHP में वाल्स्ट की अवधारणा या "वैकल्पिक तर्क" की सूची मौजूद नहीं है।

$_ चर केवल आपके द्वारा दी गई तीसरी स्ट्रिंग को शामिल करेगा। एक सरणी या एक स्ट्रिंग की अनुमति देने के लिए एक ही रास्ता is_array()

public function dot($arg1){ 
    if(is_array($arg1)){ 
     return implode('.',$arg1); 
    } 
    else if $arg1 instanceof \Traversable){ 
     return implode('.',iterator_to_array($arg1)); 
    } 
    else{ 
     return implode('.',func_get_args()); 
    } 
} 

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

/** 
*@param mixed $arg1 an array, iterator that will be joined OR first string of the list 
*@return string a string with all strings of the list joined with a point 
*@example dot("1","2","3"); returns 1.2.3 dot(array(1,2,3)); returns 1.2.3 
*/ 

इसके अलावा, phpdocumentor documentation के अनुसार आप के साथ valist की तरह घोषणा कर सकते हैं

/** 
*@param string ... list of strings 
*/ 
+0

मैंने अपना जवाब संपादित किया क्योंकि मुझे ऐसा कुछ मिला जो आपके प्रश्न के साथ अधिक फिट बैठता है। – artragis

13

[UPDATED 2015-01-08]

phpdoc में यह करने के लिए पुराने तरीका था:

http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.param.pkg.html

/** 
* @param int $param,... 
**/ 

हालांकि, यह अब समर्थित नहीं है। PHP 5.6 के रूप में वैराडिक विधि पैरामीटर्स PHP भाषा का हिस्सा हैं, और PHPDoc को PHPDoc 2.4 के रूप में इसे प्रतिबिंबित करने के लिए अद्यतन किया गया है यदि मुझे सही याद है। यह ईएपी 13 9.659 के रूप में phpStorm आईडीई में भी है (8.0.2 और ऊपर होना चाहिए)। अन्य आईडीई के कार्यान्वयन के बारे में निश्चित नहीं है।

https://youtrack.jetbrains.com/issue/WI-20157

किसी भी मामले में, variadic मापदंडों के लिए आगे बढ़ते हुए DocBlocks के लिए उचित सिंटैक्स है:

/** 
* @param int ...$param 
**/ 
11

Variadics के रूप में PHP में लागू किया जाता है 5.6 phpDocumentor version 2.4 के रूप में निम्न सिंटैक्स का समर्थन करना चाहिए।

/** 
* @param Type ...$value 
* Note: PHP 5.6+ syntax equal to func_get_args() 
*/ 
public function abc(Type ...$value) {} 

इस तरह के हस्ताक्षर का वर्णन करने का यह सही तरीका होना चाहिए। यह likelyPSR-5 में शामिल किया जाएगा।एक बार यह स्वीकार किए जाने के बाद आईडीई को इस "आधिकारिक" सिफारिश का समर्थन करने के लिए पालन करना चाहिए।

हालांकि, इस समय कुछ आईडीई के पास में सुधार हुआ है, जिसे वे सही मानते हैं। आईडीई विक्रेता पर कठोर हिट करें जो ऑफलाइन PHP सिंटैक्स का समर्थन करने के लिए 5.6 के रूप में समर्थित है या इस दौरान जो भी काम करता है उसका उपयोग करें।

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