2011-11-07 13 views
7

मेरा लक्ष्य किसी जटिल तर्क को if() कथन में रखना है। आइए मान लें कि मेरे पास मूल्यों की एक सरणी है और यदि मैं अपने सरणी में सब कुछ nonzero है तो मैं थोड़ा कोड निष्पादित करने जा रहा हूं। आम तौर पर, मैं कह सकता हूं, $valid = true, foreach मेरी सरणी, और शून्य मिलने पर $valid = false सेट करें। तो मैं अपना कोड if ($valid) चलाऊंगा। वैकल्पिक रूप से, मैं अपने लूप को एक फ़ंक्शन में डाल सकता हूं और फ़ंक्शन को अपने if() पर रख सकता हूं।आईएफ स्टेटमेंट में PHP बंद होने पर क्या रोकता है?

लेकिन मैं आलसी हूं, इसलिए मैं "मान्य" झंडे के समूह के साथ नहीं बल्कि मैं एक नया नया फ़ंक्शन लिखना चाहता हूं जिसका उपयोग केवल एक ही स्थान पर किया जा रहा है।

if ($q = function() { return 'foo'; }) { 
    echo $q; 
} 
else { 
    echo 'false'; 
} 

मैं उम्मीद कर रहा था कि if जो सही का आकलन हो जाता है 'foo',:

तो मान लें कि मैं इस किया है। मेरा बंद $q पर प्रतिबद्ध है और कथन निष्पादित करता है। $q स्ट्रिंग foo लौटाता है, और 'foo' मुद्रित होता है।

इसके बजाय, मुझे त्रुटि Object of class Closure could not be converted to string मिलती है।

तो चलो इस के बजाय की कोशिश करते हैं:

if (function() { return false; }) { 
    echo 'foo'; 
} 
else { 
    echo 'true'; 
} 

मैं उम्मीद कर रहा था कि मेरे समारोह वापसी होगी झूठे और 'सही' मुद्रित किया जाएगा। इसके बजाय, 'foo' मुद्रित है।

इस बारे में गलत क्या है कि मैं इस बारे में जा रहा हूं? ऐसा लगता है कि यह कह रहा है, "हाँ, यह सुनिश्चित है कि एक समारोह है!" "नहीं, क्योंकि फ़ंक्शन का मूल्यांकन गलत है।" क्या ऐसा करने का कोई तरीका है जिसे मैं करने की कोशिश कर रहा हूं?

+3

आप उनकी वापसी मान के साथ काम करता है भ्रमित करने के लिए लग रहे हैं निर्भर करता है। – delnan

+0

मुझे लगता है कि मैं जो चाहता था वह 'अगर (फ़ंक्शन() {वापसी झूठी;}()) {' जो जावास्क्रिप्ट में स्पष्ट रूप से मान्य है लेकिन PHP नहीं है। – ajp5103

+0

http://stackoverflow.com/questions/3568410/anonymous-functions-that-execute-immediately call_user_func() वह है जिसे मैं ढूंढ रहा था। – ajp5103

उत्तर

4

function() { return false; } अन्य वर्ग प्रकार के साथ new के प्रकार Closure की एक वस्तु, समान बनाता है, निम्नलिखित कोड की तुलना $func अब एक वस्तु है। प्रत्येक ऑब्जेक्ट if खंड में सत्य देता है। तो

if ($func) 
{ 
    # true 
} else { 
    # will never go here. 
} 

आप इसके बजाय यह करने के लिए चाहते हो सकता है:

if ($func()) 
{ 
    # true 
} else { 
    # false 
} 

जो बंद वस्तु $func आह्वान और यह वापसी मान है दे देंगे।

3

इनमें से दोनों सत्य होने का मूल्यांकन करते हैं।

यदि आपको कथन में इसका उपयोग करने के लिए फ़ंक्शन निष्पादित करने की आवश्यकता है।

इस प्रयास करें:

$q = function() { return false; }; 
if ($q()) { //should not go here. 
    echo $q(); 
} 
else { 
    echo 'false'; 
} 

डेमो:

$func = function() { return false; }; 

: http://codepad.viper-7.com/Osym1s

1

आप बंद को क्रियान्वित नहीं कर रहे हैं जब आप echo फोन, इस प्रकार यह बंद, नहीं बंद का परिणाम बाहर मुद्रित करने के लिए कोशिश कर रहा है:

echo $q(); 
0

आपको गुमनाम समारोह पैदा कर रहे हैं, लेकिन यह क्रियान्वित करने कभी नहीं । जब आप $q = function() { return 'foo'; } का परीक्षण करते हैं, तो आप क्या कह रहे हैं "इस अज्ञात फ़ंक्शन का संदर्भ $ q पर असाइन करें, और $ q नहीं है, तो यह परीक्षण पास करें" (PHP मज़ेदार नहीं है?)

आपको इनकार करने की आवश्यकता है $q परीक्षण और प्रतिबिंबित करने से पहले बंद करें और $q पर इसके परिणाम को असाइन करें।

2

PHP के बंद होने को Closure प्रकार की हैक - ऑब्जेक्ट्स के रूप में कार्यान्वित किया जाता है। आपका कोड वास्तव में इस वर्ग के किसी ऑब्जेक्ट को तुरंत चालू कर रहा है, और इसे $ q को असाइन कर रहा है। पीएचपी में, काम का परिणाम मूल्य निर्धारित किये जाने से है, इसलिए प्रभाव में आप कोड को

if (new Closure()) { ... } 
संबंधित मुद्दे