2010-08-12 12 views
10

मान लें मैं निम्नलिखित हस्ताक्षर के साथ एक विधि/समारोह है:कैसे बताएं कि PHP विधि/फ़ंक्शन में वैकल्पिक पैरामीटर सेट किया गया था या नहीं?

foo($bar = 0) 

अंदर foo, कैसे बताऊँ मैं अगर $ बार स्थापित किया गया था या नहीं? isset alway वापस आ जाएगी सही के बाद से $ बार घटना कुछ भी नहीं में असाइन किया गया है एक foo को पारित कर दिया है।

0 के लिए जांच की जा रही एक विकल्प नहीं है। मैं पैरामीटर स्पष्ट रूप से 0 पर सेट या 0.

+1

यह एक फ़ंक्शन के व्यवहार के लिए वास्तव में एक कट्टर तरीका है। 'एफ (0)' को तर्क के 'स्रोत" के बावजूद, एक ही परिणाम का उत्पादन करना चाहिए। –

+0

यदि आप एक पॉलिमॉर्फिक विधि नहीं बना रहे हैं जो पैरामीटर सेट होने पर एक चीज करता है और पैरामीटर सेट नहीं होने पर दूसरी बात होती है। – StackOverflowNewbie

+0

फ्रैंक, कुछ फ़ंक्शंस में निर्मित यह करते हैं, मेरे मामले में मुझे सबस्ट्रेट को लपेटने की आवश्यकता होती है, और जब मैंने रैपर को $ लम्बाई को शून्य से घटाकर डिफ़ॉल्ट रूप से घटा दिया, तो मुझे कुछ भी वापस नहीं मिला, क्योंकि सबस्ट्रेट ने 0 लंबाई के रूप में व्याख्या की थी। हां, यह बेहद कमजोर है, मैं PHP के बेहतर कुछ भी उम्मीद करने आया हूं। –

उत्तर

13

को दोषी जा रहा है के बीच अंतर पता करने के लिए, बस func_num_args() का उपयोग विशेष रूप से कितने तर्क में पारित किए गए के लिए जाँच करने की जरूरत है।

<?php 
function foo($bar = 0) 
{ 
    echo "\nNumber of arguments: " . func_num_args(); 
} 

    // Outputs "Number of arguments: 1" 
foo(0); 

    // Outputs "Number of arguments: 0" 
foo(); 
?>  

Live example

9

आप func_get_args का उपयोग कर सकते हैं। उदाहरण:

function foo($optional=null) { 
    if (count(func_get_args()) > 0) 
     echo "optional given\n"; 
    else 
     echo "optional not given\n"; 
} 

foo(); //optional not given 
foo(null); //optional given 

नोट आंतरिक पीएचपी कार्यों के लिए इस्तेमाल किया सम्मेलन हमेशा वैकल्पिक तर्क एक डिफ़ॉल्ट मान देने के लिए और उन्हें एक ही व्यवहार किया है जब दोनों तर्क नहीं दिया जाता है और उसके डिफ़ॉल्ट मान स्पष्ट रूप से दिया जाता है के लिए है। यदि आप कभी भी अन्यथा पाते हैं, तो एक बग रिपोर्ट दर्ज करें। बिना if रों इस तरह यह आइए सामान आप करते हैं:

function strpos_wrap($haystack, $needle, $offset = 0) { 
    return strpos($haystack, $needle, $offset); 
} 

यह सम्मेलन अधिक लागू की जाती है कठिनाई यह है कि आप इस सवाल का नेतृत्व आप से पता चला है के रूप में, userland है। यदि सम्मेलन आपकी आवश्यकताओं के अनुरूप नहीं है, तो कम से कम अपने दृष्टिकोण पर पुनर्विचार करें। func_num_args/func_get_args का उद्देश्य मुख्य रूप से चर तर्क तर्कों को अनुमति देने के लिए है।

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

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