2011-02-07 22 views
9

मुझे खुशी से php फ़ंक्शन func_get_args() से अनजान है, और अब मैंने इसे खोज लिया है, मैं इसे हर जगह उपयोग करना चाहता हूं। फ़ंक्शन परिभाषा में स्पष्ट तर्क घोषणा की तुलना में func_get_args का उपयोग करने की कोई सीमाएं हैं?func_get_args बनाम स्पष्ट तर्क

+0

वास्तव में कोई बड़ी समस्या नहीं है, लेकिन यह आईडीई के ऑटो-पूर्णता के साथ काम नहीं करती है। अधिकांश आईडीई के पार्स PHPDoc टिप्पणियां इसके आसपास काम करने के लिए टिप्पणियां करती हैं। क्या कोई कारण है कि आप तर्क निर्दिष्ट नहीं करना चाहते हैं? ज्यादातर मामलों में, वास्तव में कोई फायदा नहीं होता है। – simshaun

+1

सामान्य ज्ञान के बगल में कोई सीमा नहीं। इस फ़ंक्शन का उपयोग करें जब तर्कों की संख्या अज्ञात है और जब तर्कों को कड़ाई से परिभाषित किया जाता है तो इसका उपयोग न करें। बस इतना ही। –

+0

वर्तमान संपादक जो मैं उपयोग करता हूं वह है ड्रीमवेवर 8 (आप इसे पढ़ने के बाद कितने क्रिंग किए गए हैं?) और यह वास्तव में किसी भी ऑटो-पूर्णता को वास्तव में नहीं करता है। लेकिन मेरे लिए func_get_args का उपयोग करने में सबसे बड़ा फायदा यह प्रतीत होता है कि अगर मुझे दो तर्कों को जोड़ने के लिए एक फ़ंक्शन वापस जाना और फिर से करना है, तो एक अच्छा मौका है कि मैं किसी भी मौजूदा कोड को तोड़ नहीं दूंगा जो पहले स्पष्ट रूप से घोषित किया गया था तर्क। –

उत्तर

11

आपको func_get_args का उपयोग नहीं करना चाहिए जबतक कि आप वास्तव में की आवश्यकता नहीं है।

यदि आप एक विशिष्ट संख्या में तर्क लेने के लिए कोई फ़ंक्शन परिभाषित करते हैं, तो PHP कॉल त्रुटि पर पर्याप्त तर्क प्रदान नहीं करते हैं तो PHP एक त्रुटि उठाएगा।

यदि आप func_get_args के माध्यम से कोई भी तर्क लेते हैं, तो यह विशेष रूप से जांचने के लिए आप पर निर्भर करता है कि आपके द्वारा अपेक्षित सभी तर्क आपके कार्य में पारित किए गए हैं।

इसी तरह, आप type hinting का उपयोग करने की क्षमता खो देते हैं, तो आप default values की आपूर्ति नहीं कर सकते हैं, और यह बताने में बहुत कठिन हो जाता है कि आपके कार्य को एक नज़र में क्या तर्क मिलता है।

संक्षेप में, आप PHP को रोकने में मदद करते हैं (संभावित रूप से डीबग करने में मुश्किल) तर्क त्रुटियों।

function do_stuff(MyClass tmpValue, array $values, $optional = null) { 
    // This is vastly better... 
} 

function do_stuff() { 
    // ... than this 
} 

यहां तक ​​कि अगर आप तर्क के परिवर्तनशील, आप स्पष्ट रूप से के रूप में आप कर सकते हैं के रूप में कई तर्क निर्दिष्ट करना चाहिए अनुमति देना चाहते हैं:

/** 
* Add some numbers 
* Takes two or more numbers to add together 
*/ 
function add_numbers($num_1, $num_2 /* ..., $num_N */) { 
    $total = 0; 
    for ($i = 0; $i < func_num_args(); ++$i) 
    $total += func_get_arg($i); 
    return $total; 
} 

add_numbers(1,2); // OK! 
add_numbers(1,2,3); // OK! 
add_numbers(1)  // Error! 
+0

वास्तव में डिफ़ॉल्ट आप ऐसा कर सकते हैं क्योंकि तर्क निर्धारित नहीं होने पर आप हमेशा अपना डिफ़ॉल्ट सेट कर सकते हैं, लेकिन इसका तरीका अधिक बदसूरत है। –

+1

मैं यह भी इंगित करना चाहूंगा कि 'func_get_args' का उपयोग करके आप प्रत्येक मूल्य की स्पष्ट रूप से जांच कर सकते हैं, और प्रति कार्य/विधि के बारे में ~ 7 अतिरिक्त लाइनें होंगी। – RobertPitt

+0

@ डेविड मैंडिंग आपके स्वयं के डिफ़ॉल्ट तर्क/प्रकार की जांच बिल्कुल वैसा ही नहीं है क्योंकि PHP आपके लिए ऐसा करता है। इस मामले में, डिफ़ॉल्ट तर्क मान स्पष्ट रूप से अंतर्निहित सुविधा को संदर्भित करते हैं, न कि आप स्वयं को एक साथ जोड़ते हैं। – meagar

0

मुझे लगता है कि स्वत: पूर्ण करने के लिए कठिन है अगर के लिए क्या करने के लिए असंभव नहीं आईडीई (हालांकि यह phpdoc @param घोषणा का उपयोग कर सकता है)

संपादित करें: जब आप केवल एक तर्क करते हैं तो आप इसका उपयोग कर सकते हैं: एक-आयामी सरणी, जो कुंजी कोई फर्क नहीं पड़ता। यह तब बहुत आसान हो जाता है।

1
  • शुरुआत के लिए मुझे लगता है कि इसका प्रदर्शन प्रभाव पड़ता है।
  • यह आपके कोड को पढ़ने और समझने के लिए बहुत कठिन बनाता है।
  • कोई स्वचालित त्रुटि चेतावनी दर्द को डीबग करने में कोई दिक्कत नहीं होगी।
+3

प्रदर्शन प्रभाव एक डीलब्रेकर होने के लिए पर्याप्त नहीं है, अगर यह बिल्कुल मौजूद है। यह निश्चित रूप से विचार करने वाली पहली बात नहीं होनी चाहिए। यदि वर्कगेज नौकरी के लिए सही उपकरण हैं, तो उनका उपयोग करें। – cHao

+0

यदि आपको वास्तव में इसकी आवश्यकता है तो आपको इसका उपयोग करना चाहिए, लेकिन आपकी सामान्य विधि के रूप में यह एक बुरा विचार है और भले ही आप किसी भी कोड गुणवत्ता के मुद्दों की उपेक्षा करते हैं, फिर भी एक छोटा प्रदर्शन हिट होगा, हो सकता है कि आपको कुछ भी नहीं सोचने की आवश्यकता हो कॉल करें, लेकिन अगर हर विधि इसका उपयोग करती है, तो मुझे लगता है कि यह जोड़ सकता है, और उसने विशेष रूप से सभी कॉल के लिए इसका उपयोग करने के बारे में सोचा;) –

+0

इसके अलावा, अन्य सभी तर्क केवल डेवलपर से चिंतित हैं लेकिन प्रदर्शन हिट है, चाहे कितना छोटा हो पूर्ण तथ्य जो इस तर्क को कम से कम एक छोटे से फ़ंक्शन को निश्चित तर्कों के साथ सीधे कार्य करता है :) –

0

एकमात्र सीमा मुझे पता है कि सामान को पार्स समय पर जांचना कठिन होता है। ध्यान दें कि इसमें स्वचालित दस्तावेज उपकरण के लिए पार्सर्स शामिल हैं, क्योंकि फ़ंक्शन ने तर्क दिया है कि फ़ंक्शन घोषणा में सही नहीं हैं

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