2011-02-03 12 views
5

मैं एक Zend फ्रेमवर्क परियोजना के लिए डिफ़ॉल्ट index.php फ़ाइल में इस दिलचस्प रेखा के पार पहुंचादिलचस्प PHP वाक्यविन्यास: एक 'implied अगर'?

defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

यह कहने जा रहा है "APPLICATION_PATH परिभाषित नहीं है, तो पर जाने के लिए और इसे परिभाषित ..."

मुझे PHP में इस नियंत्रण संरचना से अवगत नहीं है। यह लगभग 'अंतर्निहित अगर' या 'if/else' की तरह है। क्या कोई इस पर मेरी मदद कर सकता है?

उत्तर

16

यह एक नियंत्रण संरचना नहीं है - यह केवल || काम करता है। यदि पहले ऑपरेंड का मूल्यांकन true पर किया गया था - तो दूसरे का मूल्यांकन नहीं किया जा रहा है।

http://php.net/manual/en/language.operators.logical.php --- नमूना की पहली 4 पंक्तियों को देखें।

// -------------------- 
// 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()); 
+3

इसके विपरीत, केवल अगर पहली अभिव्यक्ति झूठी है, तो दूसरे का मूल्यांकन किया जाता है। –

+2

@ स्यूरियल ड्रीम्स: जाहिर है - हाँ ;-) – zerkms

+0

+1 अच्छा! [विकिपीडिया] पर आगे पढ़ने (http://en.wikipedia.org/wiki/Short-circuit_evaluation)। – alex

2

तकनीकी तौर पर यह सिर्फ कुछ बूलियन अभिव्यक्ति है कि का मूल्यांकन किया जाता है, लेकिन परिणाम फेंक देता है। यह शॉर्ट सर्किट तर्क का उपयोग करके यह सुनिश्चित करने के लिए है कि इसका आधा भाग केवल तभी चलाया जाता है जब पहली छमाही झूठी होती है।

इसी तरह, आप परिणाम पर कब्जा कर सकते हैं:

$foo = false || true; // $foo will contain true. 
+0

और हमेशा प्यारा टर्नरी ऑपरेटर होता है: '$ action = (परिभाषित ('APPLICATION_PATH'))? 'डिफ़ॉल्ट': परिभाषित करें ('APPLICATION_PATH', realpath (dirname (__ FILE__)। '/../plication')); ' – buley

+0

@editor अगर लॉजिकल ठीक काम कर रहा है और अधिक पठनीय है तो टर्नरी का उपयोग क्यों करें –

2

यह जो वास्तव में एक है, तो-और कुछ की तरह कुछ को पूरा करने के लिए एक रास्ता है एक बूलियन अभिव्यक्ति का एक short-circuiting evaluation है।

4

|| एक छोटा सर्किटिंग ऑपरेटर है। यदि बाएं हाथ का ऑपरेंड true है, तो पूरे के रूप में अभिव्यक्तिtrue होनी चाहिए, इसलिए यह दाएं हाथ के ऑपरेंड का मूल्यांकन करने से परेशान नहीं होगा। आप रिवर्स तरीके से && का उपयोग कर सकते हैं; यदि बाएं हाथ का ऑपरेंड false है, तो पूरी तरह से अभिव्यक्ति false होनी चाहिए, इसलिए दाएं हाथ के ऑपरेंड का मूल्यांकन नहीं किया जाएगा।

यह कुछ अन्य भाषाओं में चीजों को करने का एक बेवकूफ तरीका है। हालांकि इस मामले के लिए मैं आमतौर पर PHP में एक स्पष्ट if पसंद करूंगा।

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