2012-09-25 14 views
5

जब एक समारोह है कि मानकों का एक नंबर की आवश्यकता है पारित होने के लिए, इस तरह के रूप में सात मानकों, जो बेहतर अभ्यास है है:PHP में किसी फ़ंक्शन के लिए पैरामीटर बनाम व्यक्तिगत पैरामीटर के सरणी पास करना?

function foo($par1, $par2, $par3, $par4, $par5, $par6, $par7) 
{ 
} 

या

function foo(array $args) 
{ 
} 

दूसरे उदाहरण में कहाँ $args होगा तत्वों के रूप में पैरामीटर के साथ एक सरणी।

मैं दोनों विधियों का उपयोग करके असंगत रूप से रहा हूं।

पहली विधि का उपयोग करने का नुकसान यह है कि यदि आपको पैरामीटर गलत का ऑर्डर मिलता है, तो आप खराब हो जाते हैं (और यह डीबग करना वाकई मुश्किल हो सकता है क्योंकि यह हमेशा स्पष्ट नहीं होता है)। सरणी विधि का उपयोग करने का यह लाभ है।

पहले प्रकार का उपयोग करने का लाभ (आईएमएचओ) यह है कि एक अच्छा PHP संपादक जैसे कि phpStorm आपको पैरामीटर टाइप करने के रूप में पैरामीटर के नाम दिखाएगा, जो कि पैरामीटर को देखने के लिए फ़ंक्शन पर जाने से आसान है एक सरणी में पारित करने की आवश्यकता है।

अपनी सलाह की सराहना करें।

+0

परियोजना के संदर्भ में आपके लिए कभी भी क्या काम करता है। –

+0

यदि आपके पास 7 पैरामीटर के साथ कोई फ़ंक्शन है, तो शायद इसकी कई ज़िम्मेदारियां हैं। –

उत्तर

4

सैद्धांतिक रूप से, प्रत्येक पैरामीटर में लॉजिकल पूरे शामिल होना चाहिए। संग्रह मूल्यों के संग्रह का प्रतिनिधित्व करने के लिए हैं, विधि पैरामीटर के कुल नहीं; विधि के उद्देश्य को स्पष्ट रूप से इंगित करने के लिए व्यक्तिगत मानकों को अलग से पारित किया जाना चाहिए।

व्यावहारिक रूप से, किसी सरणी में पैरामीटर पास करते समय, आपको यह सुनिश्चित करने के लिए मैन्युअल चेक का एक टन करना होगा कि सही पैरामीटर पारित किए गए हैं। आप अपने पैरामीटर को स्पष्ट, तार्किक नाम (और जहां संभव हो वहां टाइप करें) देकर किसी भी अस्पष्टता से बच सकते हैं। साथ ही, जैसा कि एक टिप्पणी पहले से ही कहा गया है, यदि कोई विधि 7 पैरामीटर लेती है, तो शायद यह कुछ रिफैक्टरिंग के लिए परिपक्व है।

संपादित करें: अपने विधि/समारोह अल्प परिभाषित "विकल्प" को प्रभावित क्या कोड ही एक छोटी सी तरह से करता है का एक सेट को स्वीकार करता है, Symfony OptionsResolver घटक का उपयोग, बहुत अपने विकल्पों के सत्यापन को कम करने पर विचार सरणी।

0

यदि आपके पास तर्कों के आधार पर बहुत सारे विकल्प हैं या अधिक लचीलापन चाहते हैं तो func_get_args() देखें।

function foo() 
{ 
    $arg_list = func_get_args(); 
    for ($i = 0; $i < $numargs; $i++) { 
     echo "Argument $i is: " . $arg_list[$i] . "<br />\n"; 
    } 
} 

यदि आप स्वीकार्य तर्कों को सीमित करना चाहते हैं तो चर परिभाषित करना सर्वोत्तम है।

1

मुझे लगता है कि यह प्रश्न पर उबलता है "PHP कितना मजबूत टाइप है?" या "मैं अपनी सामग्री को कितना मजबूत टाइप करना चाहता हूं?"

स्पष्ट, सरणी सबसे कमजोर युग्मित है। चर और उनकी संख्या कॉलर को पूरा कर दिया गया है।

अलग-अलग पैरामीटर के साथ आपका कॉल थोड़ा अधिक मजबूत युग्मित है, इसलिए कम से कम पैरामीटर प्रदान किए जाने चाहिए।

IMHO आप एक प्रकार का कॉलिंग भूल गए हैं, और यह type hinting के साथ है। यह मजबूत टाइपिंग का सबसे मजबूत तरीका है कि PHP, इस समय, प्रदान करता है।

उदाहरण:

function foo(\MyNamespace\MyObject $par1, \YourNamespace\YourObject $par2) 
{ 
} 

मेरे राय: केवल मजबूत टाइप किया भाषाओं में मेरी पृष्ठभूमि के साथ, मैं मजबूत टाइप typed hinting पसंद करते हैं। अफवाहें हैं कि PHP 5.5 या php 6 स्केलर्स को एक प्रकार के संकेत के रूप में भी समर्थन देगा।

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