2012-04-08 8 views
6

मैं एक अनुकूलन सनकी (कम से कम मेरी परिभाषा से) हूं और यह सवाल मुझे थोड़ी देर के लिए परेशान कर रहा है।PHP || और & amp तार्किक अनुकूलन

मैं सोच रहा हूँ अगर पीएचपी & & पर कुछ अनुकूलन करता है और ||: निम्न उदाहरण लें:

$a = "apple"; 
$b = "orange"; 
if ($a == "orange" && $b == "orange") { 
    //do stuff 
} 

जब कि कोड निष्पादित करता है, यह अगर $ एक "नारंगी के बराबर है की जाँच करेगा। " इस मामले में यह नहीं है। हालांकि, & & ऑपरेटर है। चूंकि पहला भाग ($ a == "नारंगी") पहले से ही झूठा लौटा है, क्या PHP अभी भी जांच करेगा कि $ बी "नारंगी" के बराबर है या नहीं?

मैं || के लिए एक ही सवाल है:

$a = "orange"; 
$b = "orange"; 
if ($a == "orange" || $b == "orange") { 
    //do stuff 
} 

जब यह जाँच करता है, तो $ एक बराबर करने के लिए "नारंगी" है यह सच देता है। चूंकि वह || ऑपरेटर सच हो जाता है, क्या PHP भी के दूसरे भाग की जांच करेगा (चूंकि हम पहले ही जानते हैं कि यह सच होगा)?

उम्मीद है कि मैं यहां समझ रहा हूं, और उम्मीद है कि किसी के पास मेरे लिए जवाब है। धन्यवाद!

+0

है यही कारण है कि मैं हमेशा मान लिया गया है। और, व्यावहारिक रूप से, और ऑपरेटर इस तरह से काम करता है। उदाहरण के लिए, मैं 'if (iss ($ a) और $ $ कुछ क्लासस और $ $ a-> कुछ विधि() ==' नारंगी ') का उदाहरण दे सकता हूं और इसे अगले परीक्षण के लिए सशर्त के प्रत्येक चरण को पारित करना होगा। लेकिन, मेरे पास मुझे वापस करने के लिए कुछ भी नहीं है, इस तथ्य को छोड़कर मुझे पता है कि यह काम करता है। –

+2

क्यों कोशिश नहीं करते?'अगर (सच || मरें()) {echo '1';}' और 'if (true && die()) {echo '1';}' –

उत्तर

6

पीएचपी द्विआधारी सशर्त, (जैसे &&, || या उनके लगातार समकक्ष) के साथ short circuit evaluation का उपयोग करता है, इसलिए यदि एलएचएस के मूल्यांकन का परिणाम का मतलब है आरएचएस आवश्यक नहीं है, यह नहीं होगा।

उदाहरण के लिए ...

method_exists($obj, 'func') AND $obj->func(); 

... इस तथ्य का एक शोषण है। आरएचएस का मूल्यांकन केवल तभी किया जाएगा जब एलएचएस इस उदाहरण में सच्चाई मान देता है। तर्क यहां समझ में आता है, क्योंकि यदि आप मौजूद हैं तो केवल एक विधि को कॉल करना चाहते हैं (जब तक आप __call() का उपयोग नहीं कर रहे हैं, लेकिन यह एक और कहानी है)।

आप इसी तरह के OR का भी उपयोग कर सकते हैं।

defined('BASE_PATH') OR die('Restricted access to this file.'); 

यह पैटर्न अक्सर PHP फ़ाइलों में पहली पंक्ति के रूप में उपयोग किया जाता है जिसका उपयोग शामिल किया जाना है और सीधे नहीं पहुंचाया जा सकता है। यदि BASE_PATH स्थिरता मौजूद नहीं है, तो एलएचएस falsy है, इसलिए यह आरएचएस निष्पादित करता है, जो die() स्क्रिप्ट है।

+0

क्या आप संभवतः उस व्यक्ति के शब्दों में पुन: कार्य कर सकते हैं? Haha। मैं उन शब्दों पर एक त्वरित Google खोज करूँगा। पहली स्थिति के बाद – fruitcup

+0

@DrAgonmoray, PHP आवश्यक होने पर अतिरिक्त स्थितियों का मूल्यांकन करेगा :) – rawb

+0

@rawb धन्यवाद। :) – fruitcup

1

हाँ, पीएचपी शॉर्ट सर्किट && और || ऑपरेटरों, जिसका अर्थ है कि कोई है, है ना संकार्य अगर बाईं संकार्य के मूल्य का मतलब है कि यह मूल्यांकन की आवश्यकता नहीं है का मूल्यांकन नहीं किया जाएगा। उन्हें अनुकूलित करने की कोई ज़रूरत नहीं है। आप इसे इस तरह का परीक्षण कर सकते हैं:

function one() { 
    echo "One"; 
    return false; 
} 

function two() { 
    echo "Two"; 
    return true; 
} 

one() && two(); // Outputs One 
echo "\n"; 
two() || one(); // Outputs Two 

Here's a demo. अगर कोई छोटी-सर्किटिंग थे, तो आप प्राप्त करेंगे:

OneTwo 
TwoOne