2012-03-02 17 views
6

संभव डुप्लिकेट की अनदेखी:
Any way to specify optional parameter values in PHP?पीएचपी समारोह - कुछ डिफ़ॉल्ट पैरामीटर

सिर्फ बेतरतीब ढंग से इस बारे में जाना।

मैं बहुत की तरह एक समारोह है, तो:

public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){ 

//do something random 

} 

जब फ़ंक्शन को कॉल यह संभव पहले दो क्षेत्रों पर ध्यान न दें और उन्हें अभी तक डिफ़ॉल्ट 3 निर्दिष्ट छोड़ने के लिए है।

उदाहरण के लिए:

$random = $this->my_model->getSomething(USE_DEFAULT, USE_DEFAULT, 10); 

मैं जानता हूँ कि मैं 1 और 2 मापदंडों लेकिन पारित कर सकते हैं, तो उनके विशेष कीवर्ड किसी तरह का है कि बस डिफ़ॉल्ट मान का उपयोग कहते हैं सब im पूछ रहा है।

आशा है कि यह समझ में आता है। यह कोई समस्या नहीं है, सिर्फ उत्सुक है।

+0

आपके इनपुट के लिए सभी को धन्यवाद :) – fl3x7

+0

आप फ़ंक्शन या कक्षाओं के तरीकों को कॉल करते समय डिफ़ॉल्ट पैरामीटर को अनदेखा करने के लिए सिंटैक्टिक का उपयोग कर सकते हैं https://github.com/topclaudy/php-syntactic – cjdaniel

उत्तर

11

आप अपने आप को ऐसा करने की जरूरत है देखते हैं। आप null उपयोग कर सकते हैं संकेत मिलता है कि डिफ़ॉल्ट मान उपयोग किया जाना चाहिए:

public function getSomething($orderBy = null, $direction = null, $limit = null) { 
    // fallbacks 
    if ($orderBy === null) $orderBy = 'x'; 
    if ($direction === null) $direction = 'DESC'; 

    // do something random 
} 

फिर null पारित जब यह बुला संकेत मिलता है कि आप चूक उपयोग करना चाहते हैं:

$random = $this->my_model->getSomething(null, null, 10); 

एक अन्य संभावित समाधान कि मैं कभी-कभी पैरामीटर सूची के बहुत अंत में एक अतिरिक्त पैरामीटर का उपयोग करता हूं, जिसमें सभी वैकल्पिक पैरामीटर होते हैं:

public function foo($options = array()) { 
    // merge with defaults 
    $options = array_merge(array(
     'orderBy' => 'x', 
     'direction' => 'DESC', 
     'limit'  => null 
    ), $options); 

    // do stuff 
} 

इस तरह आपको सभी वैकल्पिक तर्क निर्दिष्ट करने की आवश्यकता नहीं है। array_merge() सुनिश्चित करता है कि आप हमेशा विकल्पों के एक पूर्ण सेट से निपट रहे हैं। आप इसे इस तरह का प्रयोग करेंगे:

$random = $this->my_model->foo(array('limit' => 10)); 

ऐसा लगता है कि वहाँ कोई आवश्यक पैरामीटर इस विशेष मामले है, लेकिन अगर आप एक की जरूरत है, बस वैकल्पिक लोगों के सामने यह जोड़ने की तरह:

public function foo($someRequiredParameter, $someOtherRequiredParameter, $options = array()) { 
    // ... 
} 
+0

सिंटेक्टिक इस के लिए एक सुंदर दृष्टिकोण प्रदान करता है। इसे यहां देखें https://github.com/topclaudy/php-syntactic – cjdaniel

-2

पढ़ने के लिए धन्यवाद आप पैरा को अनदेखा नहीं कर सकते हैं। लेकिन आप कुछ इस तरह कर सकते हैं:

public function getSomething($limit=null){ 

return $this->getSomething('x','DESC',$limit); 

} 


public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){ 

... 

} 

फिर

+2

नहीं, वह नहीं कर सकता। PHP ओवरलोडिंग का समर्थन नहीं करता है। – jwueller

1

ईमानदारी से, यह एक समस्या बन जाती है जब कार्य बहुत अधिक करने की कोशिश कर रहे हैं। जब आप कुछ पैरामीटर से अधिक फ़ंक्शन बढ़ते हैं तो आमतौर पर एक बेहतर डिज़ाइन पैटर्न होता है (आमतौर पर यह पुराना व्यक्ति है जो पुराने कोड को विरासत में मिला है, और पैरामीटर जोड़ना "काम पूरा करने" का यह सबसे तेज़ तरीका है)।

मायावी का जवाब अपने प्रश्न के अनुसार सबसे अच्छा है, लेकिन cyclomatic जटिलता पर एक नज़र डालें: http://en.wikipedia.org/wiki/Cyclomatic_complexity

यदि आपका समारोह बहुत ज्यादा कर रहा है पता करने के लिए एक अच्छा तरीका है, जो आपके सवाल का एक कम करता है शायद इसकी तुलना में समस्या अब है।

+0

बिल्कुल। हर किसी को जटिलता को ध्यान में रखना चाहिए। +1! – jwueller

+0

इसके लिए धन्यवाद। इसमें पढ़ा जाएगा :) – fl3x7

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