दिलचस्प पोस्ट
स्वयं ओविन और urlacl की मेजबानी की Asp.NET सर्वर अतुल्यकालिक पृष्ठों को संसाधित नहीं करता है एंड्रॉइड में एक पीडीएफ कैसे पढ़ें IOS 7 ऐप आइकन, आईओएस रखते हुए छवियां लॉन्च करें और नामकरण सम्मेलन 6 प्रतीक रोमन अंकों के लिए पूर्णांक परिवर्तित करना – जावा मैं फ्लास्क अनुरोध के यूआरएल के विभिन्न हिस्सों को कैसे प्राप्त करूं? क्या मैं एक सेवा के रूप में चल रहा हूं? MySql प्रदर्शन का प्रदर्शन कैसे फेसबुक पहुंच टोकन को सत्यापित करने के लिए? जांचें कि स्ट्रिंग में केवल अंक होते हैं WPF में कीबोर्ड शॉर्टकट बहुआयामी सरणी के लिए एक आयामी पहुंच: अच्छी तरह से परिभाषित सी? पोस्टग्रेएसक्यूएल द्वारा प्रस्तुत JSONB की व्याख्या आप एसक्यूएल सर्वर में हां / नो बूलियन फ़ील्ड कैसे बनाते हैं? स्थिरांक के लिए सी # नामकरण सम्मेलन?

फ़ंक्शन में डिफ़ॉल्ट आर्गमेंट का उपयोग करना

मैं PHP फ़ंक्शंस के लिए डिफ़ॉल्ट मानों के बारे में भ्रमित हूं। कहो मेरे पास इस तरह एक फ़ंक्शन है:

function foo($blah, $x = "some value", $y = "some other value") { // code here! } 

यदि मैं $ x के लिए डिफ़ॉल्ट तर्क का उपयोग करना चाहता हूं और $ y के लिए एक अलग तर्क सेट करना चाहते हैं?

मैं अलग-अलग तरीकों से प्रयोग कर रहा हूं और मैं अभी और अधिक भ्रमित हो रहा हूं। उदाहरण के लिए, मैंने इन दो प्रयासों की कोशिश की:

 foo("blah", null, "test"); foo("blah", "", "test"); 

लेकिन उन दोनों के लिए $ x के लिए कोई उचित डिफ़ॉल्ट तर्क नहीं है। मैंने इसे चर नाम से सेट करने का भी प्रयास किया है।

 foo("blah", $x, $y = "test"); 

मुझे पूरी तरह से काम करने के लिए ऐसा कुछ उम्मीद है लेकिन यह काम नहीं करता जितना मुझे उम्मीद थी। ऐसा लगता है कि मुझे कोई फर्क नहीं पड़ता है, मुझे डिफ़ॉल्ट तर्कों में टाइपिंग खत्म करना होगा, हर बार जब मैं फ़ंक्शन को बुलाऊंगा। और मुझे कुछ स्पष्ट होना चाहिए।

Solutions Collecting From Web of "फ़ंक्शन में डिफ़ॉल्ट आर्गमेंट का उपयोग करना"

मैं फ़ंक्शन घोषणा को बदलना प्रस्तावित करता हूं ताकि आप ऐसा कर सकें जो आप चाहते हैं:

 function foo($blah, $x = null, $y = null) { if (null === $x) { $x = "some value"; } if (null === $y) { $y = "some other value"; } code here! } 

इस तरह, आप foo('blah', null, 'non-default y value'); तरह एक कॉल कर सकते हैं foo('blah', null, 'non-default y value'); और इसे आप जितना चाहें काम करते हैं, जहां दूसरा पैरामीटर $x अभी भी इसका डिफ़ॉल्ट मान हो जाता है

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

जैसा कि अन्य उत्तर में कहा गया है,

डिफ़ॉल्ट पैरामीटर केवल फ़ंक्शन पर अंतिम तर्क के रूप में कार्य करते हैं। यदि आप फ़ंक्शन परिभाषा में डिफ़ॉल्ट मान घोषित करना चाहते हैं, तो एक पैरामीटर को छोड़ने और इसके बाद एक को ओवरराइड करने का कोई तरीका नहीं है।

अगर मेरे पास एक ऐसा तरीका है जो अलग-अलग मापदंडों को स्वीकार कर सकता है, और विभिन्न प्रकार के पैरामीटर, मैं अक्सर रयान पी द्वारा दिखाए गए उत्तर के समान कार्य की घोषणा करता हूं।

यहाँ एक और उदाहरण है (यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन उम्मीद है कि जानकारीपूर्ण है:

 public function __construct($params = null) { if ($params instanceof SOMETHING) { // single parameter, of object type SOMETHING } else if (is_string($params)) { // single argument given as string } else if (is_array($params)) { // params could be an array of properties like array('x' => 'x1', 'y' => 'y1') } else if (func_num_args() == 3) { $args = func_get_args(); // 3 parameters passed } else if (func_num_args() == 5) { $args = func_get_args(); // 5 parameters passed } else { throw new InvalidArgumentException("Could not figure out parameters!"); } } 

वैकल्पिक तर्क केवल फ़ंक्शन कॉल के अंत में काम करते हैं। $ X को निर्दिष्ट किए बिना भी $ y के लिए मान निर्दिष्ट करने का कोई तरीका नहीं है कुछ भाषाओं ने नामित पैरामीटर (उदाहरण के लिए VB / C #) के द्वारा इसका समर्थन किया है, लेकिन PHP नहीं है

आप इसका अनुकरण कर सकते हैं यदि आप तर्कसंगत के बजाय मापदंडों के लिए एक एसोसिएटिव सरणी का उपयोग करते हैं – अर्थात

 function foo(array $args = array()) { $x = !isset($args['x']) ? 'default x value' : $args['x']; $y = !isset($args['y']) ? 'default y value' : $args['y']; ... } 

फिर फ़ंक्शन को इस तरह कॉल करें:

 foo(array('y' => 'my value')); 
 function image(array $img) { $defaults = array( 'src' => 'cow.png', 'alt' => 'milk factory', 'height' => 100, 'width' => 50 ); $img = array_merge($defaults, $img); /* ... */ } 

यह वास्तव में संभव है:

 foo( 'blah', (new ReflectionFunction('foo'))->getParameters()[1]->getDefaultValue(), 'test'); 

चाहे आप ऐसा करना चाहते हैं एक और कहानी है 🙂


अद्यतन करें:

इस समाधान से बचने के लिए कारण हैं:

  • यह (यकीनन) बदसूरत है
  • यह एक स्पष्ट ओवरहेड है
  • अन्य उत्तरों के प्रमाण के रूप में, विकल्प हैं

लेकिन यह वास्तव में स्थितियों में उपयोगी हो सकता है जहां:

  • आप नहीं चाहते / मूल फ़ंक्शन को बदल नहीं सकते।
  • आप फ़ंक्शन को बदल सकते हैं लेकिन:

    • null (या समकक्ष) का उपयोग करना एक विकल्प नहीं है (देखें डिएगो डीडी की टिप्पणी )
    • आप या तो किसी सहयोगी या func_num_args() साथ जाना नहीं चाहते func_num_args()
    • आपकी ज़िन्दगी दो अलग-अलग स्थानों को सहेजने पर निर्भर करती है

प्रदर्शन के बारे में, एक बहुत ही सरल परीक्षण से पता चलता है कि डिफॉल्ट पैरामीटर प्राप्त करने के लिए रिफ्लेक्शन एपीआई का उपयोग करके फ़ंक्शन कॉल 25 गुना धीमा होता है , जबकि यह अभी भी एक से कम माइक्रोसॉन्क लेता है आपको पता होना चाहिए कि आप इसके साथ जीने के लिए क्या कर सकते हैं।

बेशक, यदि आप इसका प्रयोग लूप में करना चाहते हैं, तो आपको पहले से डिफ़ॉल्ट मान मिलना चाहिए।

मुझे यह करने का एकमात्र तरीका है पैरामीटर को छोड़कर। पैरामीटर को छोड़ने का एकमात्र तरीका पैरामीटर सूची को पुनर्व्यवस्थित करना है ताकि आप जिस पैरामीटर को सेट करना चाहते हैं, उसके बाद आप समाप्त करना चाहते हैं। उदाहरण के लिए:

 function foo($blah, $y = "some other value", $x = "some value") 

उसके बाद आप फू को कॉल कर सकते हैं:

 foo("blah", "test"); 

इसका परिणाम निम्न होगा:

 $blah = "blah"; $y = "test"; $x = "some value"; 

आप इसे सीधे नहीं कर सकते हैं, लेकिन एक छोटा कोड नगण्य यह अनुकरण करना संभव बनाता है

 function foo($blah, $x = false, $y = false) { if (!$x) $x = "some value"; if (!$y) $y = "some other value"; // code } 

यह मामला है, जब वस्तु बेहतर होती है – क्योंकि आप एक्स और वाई को पकड़ने के लिए अपना ऑब्जेक्ट सेट कर सकते हैं, डिफॉल्ट सेट अप आदि कर सकते हैं।

सरणी के साथ दृष्टिकोण वस्तु बनाने के करीब है (वास्तव में, ऑब्जेक्ट पैरामीटर और फ़ंक्शंस का गुच्छा है जो ऑब्जेक्ट पर कार्य करेगा, और फ़ंक्शन ले जाने वाले ऑरेंज कुछ गुच्छा ओव पैरामीटर पर काम करेंगे)

सामान्यतः आप हमेशा की तरह छोटी या कुछ ऐसी चीजें सेट कर सकते हैं जैसे कि डिफ़ॉल्ट रूप में

आप यह भी देख सकते हैं कि आपके पास तर्क के रूप में एक खाली स्ट्रिंग है, ताकि आप इस तरह कॉल कर सकें:

foo('blah', "", 'non-default y value', null);

फ़ंक्शन के नीचे:

 function foo($blah, $x = null, $y = null, $z = null) { if (null === $x || "" === $x) { $x = "some value"; } if (null === $y || "" === $y) { $y = "some other value"; } if (null === $z || "" === $z) { $z = "some other value"; } code here! } 

यदि आप null या "" भरते हैं तो इससे कोई फर्क नहीं पड़ता है, आप अभी भी उसी परिणाम प्राप्त करेंगे