2013-03-12 5 views
8
function convert($currencyType) 
{ 
    $that = $this; 
    return $result = function() use ($that) 
    { 
     if (!in_array($currencyType, $this->ratio)) 
       return false; 

     return ($this->ratio[$currencyType] * $this->money); //a float number 
    }; 
} 

$currency = new Currency(); 
echo $currency->convert('EURO'); 

क्या गलत है?क्लास क्लोजर का ऑब्जेक्ट स्ट्रिंग में कनवर्ट नहीं किया जा सका: फ़ाइल नाम।

Catchable fatal error: Object of class Closure could not be converted to string 
+5

आपका 'कन्वर्ट()' फ़ंक्शन एक फ़ंक्शन देता है। फिर आप इसे 'echo() 'ing में एक स्ट्रिंग में समन्वयित करने का प्रयास कर रहे हैं। – landons

+0

लेकिन क्लोजर $ परिणाम के लिए एक फ्लोट/झूठा लौटाता है? –

+0

और क्लोजर के अंदर आपके '$ यह' संदर्भ इसके बजाय '$ that' होना चाहिए। वे बदल सकते हैं कि 5.4 विचार में; निश्चित नहीं। – landons

उत्तर

1

बस return वहाँ हटा सकते हैं और कार्य करें::

$result = function() use ($that) 
{ 
    if (!in_array($currencyType, $this->ratio)) 
      return false; 

    return ($this->ratio[$currencyType] * $this->money); //a float number 
}; 
return $result(); 

इसके अलावा, आप आप समारोह के अंदर $that उपयोग नहीं कर रहे साकार कर रहे हैं

मैं त्रुटि संदेश मिल रहा?

वैसे, आपको वहां एक अनाम कार्य की आवश्यकता क्यों है? बस कार्य करें:

function convert($currencyType) 
{ 
    if (!in_array($currencyType, $this->ratio)) 
     return false; 

    return ($this->ratio[$currencyType] * $this->money); //a float number 
} 
+0

मैं इसे बंद करने के साथ करने की कोशिश कर रहा हूं। मुझे पता है कि यह जरूरी नहीं है क्योंकि मैं इसे बंद किए बिना कर सकता हूं। मैं सीखने के उद्देश्यों के लिए बंद करने का उपयोग करना चाहता हूं। –

+0

@ लिसामिस्कोवस्की, बंदरिएबलों में संग्रहित किया जा सकता है। इसलिए '$ var = function() {...} 'उस फ़ंक्शन को एक चर में संग्रहीत करेगा। यह सिर्फ उस स्थान पर नहीं है जहां अनाम कार्य का उपयोग किया जाए। शुरुआत से बुरी चीजें मत सीखो। जब आपको बंद करने की आवश्यकता होगी तो आपको पता चलेगा कि उनका उपयोग कैसे करें। – Shoe

+0

क्या आप मुझे एक उदाहरण दे सकते हैं जहां यह बंद करने के लिए एक अच्छी जगह है? –

0
class Currency { 
    function convert($currencyType) 
    { 
     if (!in_array($currencyType, $this->ratio)) 
      return false; 
     return ($this->ratio[$currencyType] * $this->money); //a float number 
    } 
} 

$currency = new Currency(); 
echo $currency->convert('EURO'); 

आप एक लैम्ब्डा समारोह को परिभाषित कर रहे हैं। आपको इसकी आवश्यकता नहीं है इसके अलावा, आपको bcmul() का उपयोग करना चाहिए यदि यह किसी भी प्रकार की सटीकता है; PHP में तैरने से आपको फंकी परिणाम मिलेंगे।

5

मुद्दों के युगल:

  1. क्योंकि आप एक बंद वापस लौट रहे हैं, आपके पास पहले एक चर करने के लिए बंद असाइन करें, और उसके बाद कॉल करने के लिए समारोह
  2. आपका $this संदर्भ एक के अंदर काम नहीं करेगा बंद (जिसके कारण आप use बजाय $that ing रहे हैं)
  3. तुम भी बंद के दायरे में इसे उपयोग करने $currencyType उपयोग करने की आवश्यकता

function convert($currencyType) 
{ 
    $that =& $this; // Assign by reference here! 
    return $result = function() use ($that, $currencyType) // Don't forget to actually use $that 
    { 
     if (!in_array($currencyType, $that->ratio)) 
       return false; 

     return ($that->ratio[$currencyType] * $that->money); //a float number 
    }; 
} 

$currency = new Currency(); 
$convert = $currency->convert('EURO'); 
echo $convert(); // You're not actually calling the closure until here! 
+0

एक प्रश्न , हालांकि। क्यों अगर (! In_array ($ मुद्रा प्रकार, $ that-> अनुपात)) झूठी वापसी; हमेशा झूठी वापसी करता है? $ currencyType = 'EURO' और print_r ($ that-> अनुपात) सरणी को सही ढंग से आउटपुट करता है। –

2

आपको फ़ंक्शन बंद करते समय कोष्ठक के बीच फ़ंक्शन बनाना और कोष्ठक जोड़ना होगा।

function convert($currencyType) 
{ 
    $that = $this; 
    return $result = (function() use ($that) 
    { 
     if (!in_array($currencyType, $this->ratio)) 
       return false; 

     return ($this->ratio[$currencyType] * $this->money); //a float number 
    })(); 
} 

$currency = new Currency(); 
echo $currency->convert('EURO'); 
संबंधित मुद्दे