मुझे खुशी से php फ़ंक्शन func_get_args()
से अनजान है, और अब मैंने इसे खोज लिया है, मैं इसे हर जगह उपयोग करना चाहता हूं। फ़ंक्शन परिभाषा में स्पष्ट तर्क घोषणा की तुलना में func_get_args
का उपयोग करने की कोई सीमाएं हैं?func_get_args बनाम स्पष्ट तर्क
उत्तर
आपको 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!
वास्तव में डिफ़ॉल्ट आप ऐसा कर सकते हैं क्योंकि तर्क निर्धारित नहीं होने पर आप हमेशा अपना डिफ़ॉल्ट सेट कर सकते हैं, लेकिन इसका तरीका अधिक बदसूरत है। –
मैं यह भी इंगित करना चाहूंगा कि 'func_get_args' का उपयोग करके आप प्रत्येक मूल्य की स्पष्ट रूप से जांच कर सकते हैं, और प्रति कार्य/विधि के बारे में ~ 7 अतिरिक्त लाइनें होंगी। – RobertPitt
@ डेविड मैंडिंग आपके स्वयं के डिफ़ॉल्ट तर्क/प्रकार की जांच बिल्कुल वैसा ही नहीं है क्योंकि PHP आपके लिए ऐसा करता है। इस मामले में, डिफ़ॉल्ट तर्क मान स्पष्ट रूप से अंतर्निहित सुविधा को संदर्भित करते हैं, न कि आप स्वयं को एक साथ जोड़ते हैं। – meagar
मुझे लगता है कि स्वत: पूर्ण करने के लिए कठिन है अगर के लिए क्या करने के लिए असंभव नहीं आईडीई (हालांकि यह phpdoc @param घोषणा का उपयोग कर सकता है)
संपादित करें: जब आप केवल एक तर्क करते हैं तो आप इसका उपयोग कर सकते हैं: एक-आयामी सरणी, जो कुंजी कोई फर्क नहीं पड़ता। यह तब बहुत आसान हो जाता है।
- शुरुआत के लिए मुझे लगता है कि इसका प्रदर्शन प्रभाव पड़ता है।
- यह आपके कोड को पढ़ने और समझने के लिए बहुत कठिन बनाता है।
- कोई स्वचालित त्रुटि चेतावनी दर्द को डीबग करने में कोई दिक्कत नहीं होगी।
प्रदर्शन प्रभाव एक डीलब्रेकर होने के लिए पर्याप्त नहीं है, अगर यह बिल्कुल मौजूद है। यह निश्चित रूप से विचार करने वाली पहली बात नहीं होनी चाहिए। यदि वर्कगेज नौकरी के लिए सही उपकरण हैं, तो उनका उपयोग करें। – cHao
यदि आपको वास्तव में इसकी आवश्यकता है तो आपको इसका उपयोग करना चाहिए, लेकिन आपकी सामान्य विधि के रूप में यह एक बुरा विचार है और भले ही आप किसी भी कोड गुणवत्ता के मुद्दों की उपेक्षा करते हैं, फिर भी एक छोटा प्रदर्शन हिट होगा, हो सकता है कि आपको कुछ भी नहीं सोचने की आवश्यकता हो कॉल करें, लेकिन अगर हर विधि इसका उपयोग करती है, तो मुझे लगता है कि यह जोड़ सकता है, और उसने विशेष रूप से सभी कॉल के लिए इसका उपयोग करने के बारे में सोचा;) –
इसके अलावा, अन्य सभी तर्क केवल डेवलपर से चिंतित हैं लेकिन प्रदर्शन हिट है, चाहे कितना छोटा हो पूर्ण तथ्य जो इस तर्क को कम से कम एक छोटे से फ़ंक्शन को निश्चित तर्कों के साथ सीधे कार्य करता है :) –
एकमात्र सीमा मुझे पता है कि सामान को पार्स समय पर जांचना कठिन होता है। ध्यान दें कि इसमें स्वचालित दस्तावेज उपकरण के लिए पार्सर्स शामिल हैं, क्योंकि फ़ंक्शन ने तर्क दिया है कि फ़ंक्शन घोषणा में सही नहीं हैं
- 1. session.evict बनाम स्पष्ट
- 2. वर बनाम स्पष्ट घोषणा
- 3. निहित बनाम स्पष्ट इंटरफेस
- 4. स्पष्ट बनाम अंतर्निहित एसक्यूएल
- 5. बनाम स्पष्ट इंटरफेस कार्यान्वयन
- 6. एएसपी.नेट: स्पष्ट बनाम निहित स्थानीयकरण?
- 7. "स्पष्ट" विधि बनाम नया ऑब्जेक्ट
- 8. वेक्टर स्पष्ट बनाम आकार बदलने
- 9. स्ट्रक्चर मैप स्पष्ट कन्स्ट्रक्टर तर्क निर्दिष्ट करना
- 10. स्पष्ट बनाएं तालिका कथन बनाम एक तालिका बनाना बनाम बनाम
- 11. अभिव्यक्ति बनाम Func तर्क
- 12. स्थितित्मक तर्क बनाम vs.s. कीवर्ड तर्क
- 13. पायथन सामान्य तर्क बनाम कीवर्ड तर्क
- 14. शैल रीडायरेक्शन बनाम स्पष्ट फ़ाइल हैंडलिंग कोड
- 15. एमवीसी व्यू बनाम एचटीएमएलहेपर बनाम सशर्त तर्क
- 16. अंतर्निहित (डिफ़ॉल्ट) मान बनाम स्पष्ट मूल्यों
- 17. सेलेनियम बनाम WebDriver, कोई स्पष्ट लाभ?
- 18. सी #: कार्य प्रतिनिधि बनाम स्पष्ट प्रतिनिधि
- 19. जावा में वास्तविक बनाम स्पष्ट कक्षाएं
- 20. जावा स्विच मामले - बनाम स्पष्ट गणन
- 21. एफ # स्पष्ट मिलान बनाम समारोह वाक्य रचना
- 22. नामांकित तर्क: सी # बनाम पायथन
- 23. डोमेन तर्क बनाम डेटा सत्यापन
- 24. प्रथम क्रम तर्क में भविष्य बनाम कार्य
- 25. फ़ाइल नाम बनाम एक समारोह तर्क
- 26. अजगर में, आंशिक समारोह आवेदन (currying) बनाम स्पष्ट फ़ंक्शन परिभाषा
- 27. घटना। इन्वोक (तर्क) बनाम घटना (तर्क)। कौन सा तेज़ है?
- 28. सी ++ टेम्पलेट विशेषज्ञता: "स्पष्ट टेम्पलेट तर्क के अवैध उपयोग"
- 29. संदर्भ द्वारा कॉल बनाम सूचक तर्क
- 30. सी # 'var' कीवर्ड बनाम स्पष्ट रूप से परिभाषित चर
वास्तव में कोई बड़ी समस्या नहीं है, लेकिन यह आईडीई के ऑटो-पूर्णता के साथ काम नहीं करती है। अधिकांश आईडीई के पार्स PHPDoc टिप्पणियां इसके आसपास काम करने के लिए टिप्पणियां करती हैं। क्या कोई कारण है कि आप तर्क निर्दिष्ट नहीं करना चाहते हैं? ज्यादातर मामलों में, वास्तव में कोई फायदा नहीं होता है। – simshaun
सामान्य ज्ञान के बगल में कोई सीमा नहीं। इस फ़ंक्शन का उपयोग करें जब तर्कों की संख्या अज्ञात है और जब तर्कों को कड़ाई से परिभाषित किया जाता है तो इसका उपयोग न करें। बस इतना ही। –
वर्तमान संपादक जो मैं उपयोग करता हूं वह है ड्रीमवेवर 8 (आप इसे पढ़ने के बाद कितने क्रिंग किए गए हैं?) और यह वास्तव में किसी भी ऑटो-पूर्णता को वास्तव में नहीं करता है। लेकिन मेरे लिए func_get_args का उपयोग करने में सबसे बड़ा फायदा यह प्रतीत होता है कि अगर मुझे दो तर्कों को जोड़ने के लिए एक फ़ंक्शन वापस जाना और फिर से करना है, तो एक अच्छा मौका है कि मैं किसी भी मौजूदा कोड को तोड़ नहीं दूंगा जो पहले स्पष्ट रूप से घोषित किया गया था तर्क। –