5

मैं जानता हूँ कि यह इस प्रकार वैकल्पिक तर्क उपयोग करना संभव है:PHP वैकल्पिक पैरामीटर - नाम से पैरामीटर मान निर्दिष्ट करें?

function doSomething($do, $something = "something") { 

} 

doSomething("do"); 
doSomething("do", "nothing"); 

लेकिन मान लीजिए आप निम्नलिखित स्थिति है:

function doSomething($do, $something = "something", $or = "or", $nothing = "nothing") { 

} 

doSomething("do", $or=>"and", $nothing=>"something"); 

तो उपरोक्त पंक्ति में यह डिफ़ॉल्ट होता $something "कुछ" करने के लिए, भले ही मैं बाकी सब कुछ के लिए मूल्य निर्धारित कर रहा हूं। मुझे पता है कि यह .NET में संभव है - मैं इसे हर समय उपयोग करता हूं। लेकिन यदि संभव हो तो मुझे PHP में ऐसा करने की ज़रूरत है।

क्या कोई मुझे बता सकता है कि यह संभव है? मैं ओमनिस्टार एफिलिएट प्रोग्राम को बदल रहा हूं जिसे मैंने इंटरशिप शॉपिंग कार्ट में एकीकृत किया है - इसलिए मैं किसी भी स्थान के लिए सामान्य रूप से काम करने के लिए एक फ़ंक्शन रखना चाहता हूं जहां मैं फ़ंक्शन में कॉल नहीं बदलता, लेकिन एक ही स्थान पर (जिसे मैं विस्तारित कर रहा हूं) अतिरिक्त पैरामीटर निर्दिष्ट करना चाहते हैं। मैं एक और समारोह बनाना नहीं चाहता जब तक कि मुझे बिल्कुल नहीं करना है। http://au2.php.net/manual/en/function.func-get-args.php

+1

+1 @sanmai से +1; यह भी ध्यान रखें कि पर्ल, पायथन, और रूबी आपके द्वारा वर्णित तरीके से पैरामीटर नामित सभी समर्थन। यदि यह सुविधा पर्याप्त महत्वपूर्ण है, तो आपको उन भाषाओं में से किसी एक का उपयोग करने पर विचार करना चाहिए। –

उत्तर

11

नहीं, पीएचपी कि लेखन के रूप में संभव नहीं है में। उपयोग सरणी तर्क:

function doSomething($arguments = array()) { 
    // set defaults 
    $arguments = array_merge(array(
     "argument" => "default value", 
    ), $arguments); 

    var_dump($arguments); 
} 

उदाहरण उपयोग:

doSomething(); // with all defaults, or: 
doSomething(array("argument" => "other value")); 

जब एक मौजूदा विधि बदलते:

//function doSomething($bar, $baz) { 
function doSomething($bar, $baz, $arguments = array()) { 
    // $bar and $baz remain in place, old code works 
} 
+0

ऐसा लगता है कि मुझे किस तरह की चीज का उपयोग करना चाहिए। जब मैं सक्षम हूं तो इसे सही उत्तर के रूप में टिकूंगा। धन्यवाद। – ClarkeyBoy

+0

बस एक चीज़ के बारे में सोचा - वर्तमान में 4 तर्क हैं, जिनमें से दो वैकल्पिक हैं। मैं एक और जोड़ना चाहता हूं 4. इस विधि को लागू करके मैं इसे एक तर्क (एक सरणी) में कम कर दूंगा। यह फ़ाइल के बाहर फ़ंक्शन में किसी भी कॉल को तोड़ देगा जिसे मैं इसमें बदलना चाहता हूं।जब तक मैंने आखिरी बार कोई PHP किया था, लेकिन मैं यह मान रहा हूं कि मैं एक ही चीज़ कहला सकता हूं लेकिन एक अलग संख्या के तर्कों के साथ। आदर्श नहीं है - लेकिन यह काम करना चाहिए। – ClarkeyBoy

+0

@ClarkeyBoy आप जितनी चाहें उतने तर्क प्राप्त कर सकते हैं। अतिरिक्त उदाहरण देखें। – sanmai

3

func_get_args पर एक नज़र डालें।

इस के आसपास पाने के लिए आपको आमतौर पर एक बहस array() प्राप्त और फिर array_merge()extract() का उपयोग कर स्थानीय चर में आपूर्ति तर्क का उपयोग करने के लिए या उन्हें डिफ़ॉल्ट एक समारोह में देखते हैं।

आपका मूल उदाहरण कुछ ऐसा दिखाई देगा:

$args = array('do' => 'do', 'or' => 'not', 'nothing' => 'something'); 
doSomething($args); 
+0

इनपुट के लिए धन्यवाद - लेकिन मुझे लगता है कि सानमाई का जवाब मेरी स्थिति को थोड़ा बेहतर बनाता है। इस विधि के साथ मैं नाम से एक तर्क प्राप्त करने में सक्षम नहीं होगा - इसलिए मैं एक ही ईंट की दीवार (मुझे लगता है) मारा जाएगा। – ClarkeyBoy

2

नाम तर्क पीएचपी (5.3) में वर्तमान में उपलब्ध नहीं हैं:

0

पीएचपी कोई नाम वाले पैरामीटर है। आपको एक कामकाज पर फैसला करना होगा।

आमतौर पर एक सरणी पैरामीटर का उपयोग किया जाता है। लेकिन एक और चालाक विधि URL पैरामीटर उपयोग कर रहा है, यदि आप केवल शाब्दिक मूल्यों की आवश्यकता:

function with_options($any) { 
     parse_str($any); // or extract() for array params 
} 

with_options("param=123&and=and&or=or"); 

के रूप में यह सूट अपने विशेष उपयोग के मामले डिफ़ॉल्ट पैरामीटर के साथ इस दृष्टिकोण को संयुक्त करें।

+0

क्या एक overkill! इस तरह एक वस्तु को पारित करने पर विचार करें। – sanmai

+2

@sanmai: हमेशा उपयोग पर निर्भर करता है। सूक्ष्मदर्शी मूर्खों के लिए हैं। और काल्पनिक ओवरहेड एक बेकार एपीआई के साथ खुद को बाधित करने के लिए बेहतर है। – mario