2010-09-29 19 views
15

मैं PHP 5.2.6 का उपयोग कर रहा हूं। मैं किसी विधि में किसी तर्क के लिए डिफ़ॉल्ट मान रखना चाहता हूं, लेकिन ऐसा लगता है कि मुझे थोड़ा बहुत चालाक मिल रहा है।क्या मैं PHP में वर्ग संपत्ति के साथ एक डिफ़ॉल्ट विधि तर्क स्थापित कर सकता हूं?

कक्षा संपत्ति blnOverwrite डिफ़ॉल्ट है और कक्षा में कहीं और सेटटेबल है। मेरे पास एक तरीका है जहां मैं इसे फिर से सेटटेबल रखना चाहता हूं, लेकिन मौजूदा मान को ओवरराइड नहीं करना चाहता हूं। जब मैं इसे आज़माता हूं तो मुझे एक त्रुटि मिलती है:

public function place($path, $overwrite = $this->blnOverwrite) { ... } 

क्या मुझे ऐसा कुछ करना चाहिए?

public function place($path, $overwrite = NULL) { 
    if (! is_null($overwrite)) { 
     $this->blnOverwrite = $overwrite; 
    } 
    ... 
} 
+3

हाँ सही तरीका है – Galen

उत्तर

11

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

From the PHP manual on Function arguments: (जोर मेरा)

एक समारोह सी ++ परिभाषित कर सकते हैं - अदिश तर्क के लिए शैली मूलभूत मूल्यों। [...] PHP भी डिफ़ॉल्ट मानों के रूप में सरणी और विशेष प्रकार NULL के उपयोग की अनुमति देता है। [...] डिफ़ॉल्ट मान निरंतर अभिव्यक्ति होना चाहिए, उदाहरण के लिए (एक उदाहरण के लिए) एक चर, वर्ग सदस्य या फ़ंक्शन कॉल होना चाहिए। [...] ध्यान दें कि डिफ़ॉल्ट तर्कों का उपयोग करते समय, किसी भी डिफ़ॉल्ट किसी भी गैर-डिफ़ॉल्ट तर्क के दाईं ओर होना चाहिए; अन्यथा, चीजें अपेक्षित के रूप में काम नहीं करेंगे।

0

आप इसे एक छोटे से छोटा कर सकते हैं:

public function place($path, $overwrite = NULL) { 
    if(!is_null($overwrite))$this->blnOverwrite = $overwrite; 
    ... 
} 

लेकिन thats लगभग एक ही

3

आप इसे इस तरह करते हैं, afaik, या 5.3 लेकिन निश्चित रूप से php के बाद से एक वर्ग के निरंतर उपयोग करना चाहिए इसके तय और बाद में बदला नहीं जा सकता है इसलिए मैं निश्चित रूप से अपने स्वयं के समाधान के साथ जाऊंगा:

class foo{ 
    const constant = 'bar'; 

    public function place($path, $overwrite = self::constant) { 
     die('bla' . $overwrite); 
    } 
} 

$bar = new foo(); 
$bar->place('baz'); 
10

आप बिल्कुल ऐसा कर सकते हैं। दोनों दुनिया के सर्वश्रेष्ठ: अपनी डिफ़ॉल्ट संपत्ति और कक्षा के निरंतर के साथ आपकी विधि का डिफ़ॉल्ट तर्क आरंभ करें।

class Object { 

    const DEFAULT_BLNOVERWRITE = TRUE; 

    protected $blnOverwrite = self::DEFAULT_BLNOVERWRITE; 

    public function place($path, $overwrite = self::DEFAULT_BLNOVERWRITE) { 
     var_dump($overwrite); 
    } 
} 

$Object = new Object(); 
$Object->place('/'); //bool(true) 
संबंधित मुद्दे

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