2010-03-29 12 views
28

मेरे पास यह if कथन है जो नीचे दी गई 2 शर्तों के लिए परीक्षण करता है। दूसरा एकस्थिति के बाद और हमेशा मूल्यांकन किया जाता है

$value = 2239; 

if ($value < 2000 && goodToGo($value)){ 
    //do stuff 
} 

function goodToGo($value){ 
    $ret = //some processing of the value 
    return $ret; 
} 

मेरा प्रश्न 2 यदि स्थिति $value < 2000&&goodToGo($value) के बारे में है एक समारोह goodToGo() इसलिए मैंने इसे कॉल करना चाहते हैं जब तक कि पहली शर्त पहले से ही सत्य है। क्या वे दोनों का मूल्यांकन किया जाता है या दूसरा व्यक्ति केवल मूल्यांकन करता है जब पहला व्यक्ति सच होता है?

दूसरे शब्दों में, क्या निम्न 2 ब्लॉक समान हैं?

if($value < 2000 && goodToGo($value)) { 
    //stuff to do 
} 

if($value < 2000) { 
    if (goodToGo($value)){ 
     //stuff to do 
    } 
} 
+3

क्या यह जांचना बहुत मुश्किल है? –

+0

@Col, मदद के लिए धन्यवाद। कैसे? – brett

+0

क्या फ़ंक्शन प्रिंट करते हैं? अगर (test1() & test2()) ... –

उत्तर

60

नहीं - दूसरी स्थिति हमेशा निष्पादित नहीं की जाएगी (जो आपके उदाहरणों को बराबर बनाती है)।

PHP के &&, ||, and, और or ऑपरेटर के रूप में "शॉर्ट सर्किट" ऑपरेटरों लागू किया जाता है। जैसे ही एक शर्त पाई जाती है जो समग्र सशर्त के परिणाम को मजबूर करती है, बाद की स्थितियों का मूल्यांकन बंद हो जाता है।

http://www.php.net/manual/en/language.operators.logical.php से

// -------------------- 
// foo() will never get called as those operators are short-circuit 

$a = (false && foo()); 
$b = (true || foo()); 
$c = (false and foo()); 
$d = (true or foo()); 
+0

मैंने इस बाद के उत्तर को चुना क्योंकि यह '(सच) के बारे में वास्तव में एक अच्छा बिंदु लाता है || foo()) '। सोचा होगा कि दूसरा मूल्यांकन करेगा क्योंकि पहले वाला 'सत्य' है, लेकिन ऐसा लगता है कि यह मामला नहीं है। जानकार अच्छा लगा। – brett

+1

@brett, हाँ - कुंजी यह है कि OR के लिए, आपको पता है कि यह सच होने वाला है जब पहली बार आपको सही लगता है - कोई भी FALSEs उसमें बदलाव नहीं करेगा। और, आप जानते हैं कि यह पहली बार गलत होने जा रहा है जब आपको कोई झूठा लगता है - कोई भी सत्य नहीं बदलेगा। – sblom

+0

व्याख्या समझ में आता है। – JayKandari

5

हां। दो ब्लॉक एक ही हैं। PHP, अधिकांश (लेकिन सभी नहीं) भाषाओं की तरह, शॉर्ट-सर्किट मूल्यांकन&& और || के लिए उपयोग करता है।

1

हां, आपके द्वारा दिए गए 2 कोड ब्लॉक समकक्ष हैं। PHP में शॉर्ट सर्किटिंग है, इसलिए जब आप का उपयोग करते हैं || और & &, पहले के बाद किसी भी कथन का मूल्यांकन केवल आवश्यक होने पर किया जाता है।

2

दूसरी शर्त केवल तभी पहले एक सच है, इसलिए दोनों कथनों के बराबर हैं जाँच की जाएगी।

3

दो ब्लॉक समान हैं।

PHP लॉजिकल ऑपरेटर "आलसी" हैं, उनका मूल्यांकन केवल तभी किया जाता है जब उनकी आवश्यकता हो। निम्नलिखित कोड प्रिंट "Hello, world!":

<?php 
$a = 10; 
isset($a) || die ("variable \$a does not exist."); 
print "Hello, world!" 
?> 

अन्य तार्किक ऑपरेटरों & & शामिल है, और, या।

<?php 
perform_action() or die ('failed to perform the action'); 
?> 

एक लोकप्रिय मुहावरे है।

0

हमेशा की तरह, अपनी खुद की भाषा के साथ अपने तकनीकी भाषा corelate इसी तरह यहाँ, अगर मैं आप कहते हैं कि मौखिक बातचीत में, अपने बस की तरह: आप कह रहे हैं = "अगर मुझे भूख लगी है '& &' मैं पिज्जा खा रहा हूँ" के समान है "अगर मुझे भूख लगी है तो केवल मैं पिज्जा खा रहा हूं"? तो यहां आप देख सकते हैं कि बाद के वाक्यांश में कहा गया है कि जब तक मैं भूखा नहीं हूं, मैं पिज्जा नहीं खा रहा हूं, और पूर्व कहता है कि मैं विनम्र हूं और मैं पिज्जा खा रहा हूं। :-)

+1

अब मुझे भूख लग रही है :) लेकिन मैं पिज्जा नहीं खाता –