PHP में या ऑपरेटर का व्यवहार




or-operator (4)

मैं व्यवहार or ऑपरेटर को समझने की कोशिश कर रहा हूं। कृपया नीचे दिए गए उदाहरण देखें:

$e = false || true;
var_dump($e);

आउटपुट की अपेक्षा की जाती है: bool(true);

$f = false or true;
var_dump($f);

आउटपुट अपेक्षित है: bool(false) । मैं इसे इस तरह से समझ गया कि = की तुलना में = की उच्च प्राथमिकता है, इसलिए यही कारण है कि $f को false सौंपा गया false

लेकिन नीचे दिया गया कोड मैंने जो सोचा था उसके विपरीत काफी काम करता है। मैंने सोचा कि $foo को 5 को आवंटित किया जाएगा और फिर खुद की तुलना की जाएगी। लेकिन $foo केवल तभी असाइन किया जा रहा है जब $foo सेट किया गया है, इसका मतलब है कि यह जांच रहा है कि $foo पहले कुछ भी सौंपा गया है, उसे 5 असाइन करें।

$foo or $foo = 5; 

क्या कोई यह समझा सकता है कि ऐसा क्यों है?


मूल बातें:

  1. निर्दिष्ट असाइनमेंट में एक असाइनमेंट अभिव्यक्ति परिणाम।

    इसका क्या मतलब है? $foo = 'bar' एक अभिव्यक्ति है, जिसमें असाइनमेंट ऑपरेटर = मान निर्दिष्ट करता है। एक अभिव्यक्ति हमेशा एक मूल्य लौटाती है। मूल्य 3 में अभिव्यक्ति 1 + 2 परिणामों की तरह, अभिव्यक्ति $foo = 'bar' परिणाम मान 'bar' । यही कारण है कि यह काम करता है:

    $foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
    
  2. बूलियन ऑपरेशंस शॉर्ट-सर्किटिंग ऑपरेशंस हैं। दोनों पक्षों का हमेशा मूल्यांकन नहीं किया जाता है यदि उन्हें होने की आवश्यकता नहीं है। true || false true || false हमेशा समग्र है, क्योंकि लेफ्टेंडेंड ऑपरेंड true , इसलिए पूरी अभिव्यक्ति true होनी चाहिए। false भी यहां मूल्यांकन नहीं किया जा रहा है।

  3. ऑपरेटर की प्राथमिकता निर्देश देती है कि अभिव्यक्ति के क्रम भागों को उप-अभिव्यक्तियों में समूहीकृत किया जाता है। उच्च प्राथमिकता ऑपरेटरों को कम प्राथमिकता ऑपरेटरों से पहले अपने ऑपरेटरों के साथ समूहीकृत किया जाता है।

इसलिए:

$e = false || true;

false || true false || true का मूल्यांकन किया जा रहा है, जिसके परिणामस्वरूप मूल्य true , जिसे $e को सौंपा गया है। || ऑपरेटर की तुलना में अधिक प्राथमिकता है, इसलिए false || true false || true को अभिव्यक्ति में समूहीकृत किया जाता है (जैसा कि ($e = false) || true विपरीत ($e = false) || true ) ($e = false) || true

$f = false or true;

यहां or उसके पास = से कम प्राथमिकता है, जिसका अर्थ है कि असाइनमेंट ऑपरेशन को पहले एक अभिव्यक्ति में समूहीकृत किया गया है or । तो पहले $f = false अभिव्यक्ति का मूल्यांकन किया जाता है, जिसके परिणामस्वरूप false (ऊपर देखें)। तो फिर आपके पास सरल अभिव्यक्ति false or true जिसका मूल्यांकन अगले और उसके परिणाम में किया जाता true , लेकिन जिसके बारे में कोई परवाह नहीं करता है।

मूल्यांकन इस तरह काम करता है:

1. $f = false or true;
2. ($f = false) or true;  // precedence grouping
3. false or true;         // evaluation of left side ($f is now false)
4. true;                  // result

अभी व:

$foo or $foo = 5; 

यहां, फिर से, $foo = 5 की उच्च प्राथमिकता है और इसे एक अभिव्यक्ति के रूप में माना जाता है। चूंकि यह or ऑपरेटर के दाहिने तरफ होता है, इसलिए अभिव्यक्ति केवल तभी मूल्यांकन की जाती है जब आवश्यक हो। यह इस बात पर निर्भर करता है कि शुरुआत में $foo क्या है। यदि $foo true , तो सही हाथ की तरफ से मूल्यांकन नहीं किया जाएगा, क्योंकि true or ($foo = 5) कुल मिलाकर true होना चाहिए। यदि $foo प्रारंभ में एक झूठा मूल्य है, तो दाईं ओर पक्ष का मूल्यांकन किया जाता है और 5 को $foo को सौंपा गया है, जिसके परिणामस्वरूप 5 , जो सत्य-आश है, जिसका अर्थ है कि समग्र अभिव्यक्ति true , जिसे कोई भी परवाह नहीं करता है।

1. $foo or $foo = 5;
2. $foo or ($foo = 5);   // precedence grouping
3. false or ($foo = 5);  // evaluation of left side
4. false or 5;           // evaluation of right side ($foo is now 5)
5. true;                 // result

$foo or $foo = 5;

Suppose let say $foo=true or $foo=5;

यहां यह मूल्यांकन या ऑपरेटर एक्सप्रेशन का मूल्यांकन नहीं करेगा, इसलिए आउटपुट $ foo = 1 होगा अब अभिव्यक्ति है

$foo=false or $foo=5;

यहां यह मूल्यांकन करेगा या बाद में = उच्च प्राथमिकता इसलिए $foo जिसके लिए यह $foo=5 मूल्यांकन करेगा, इसलिए आउटपुट 5 होगा, लेकिन जब हम $foo=false or true मूल्यांकन करेंगे तो यहां यह = उच्च प्राथमिकता पर विचार करेगा ताकि आउटपुट $foo=false लेकिन पूरी अभिव्यक्ति का मूल्यांकन सत्य के रूप में होगा क्योंकि false or true false हो जाता false


लॉजिकल ऑपरेटरों के बारे में php.net वेबपृष्ठ के अनुसार:

इस:

$e = false || true;

इस तरह के अधिनियम:

$e = (false || true) // If false is true, then $e = false. Otherwise true

इस:

$f = false or true;

इस तरह कार्य करेंगे:

($f = false) or true; // $f = false is true, as the assignment succeeded

इस:

$foo or $foo = 5; 

इस तरह कार्य करेंगे:

$foo or ($foo = 5) // foo = undefined or foo = 5, so foo = 5

आखिरी के लिए, अनिर्धारित मूल रूप से झूठी की तरह है, इसलिए foo 5 बराबर है।

साथ ही, ऑपरेटर प्राथमिकता आदेश के लिए यहां लिंक है: http://www.php.net/manual/en/language.operators.precedence.php

अद्यतन करें:

ठीक है, अब चलिए मुख्य बिंदु पर आते हैं। लाए गए क्वेरी का उपयोग करते समय हम सभी कैसे जानते हैं:

while($row = @mysql_fetch_assoc($result))

और हम सभी जानते हैं कि लूप केवल true पर निष्पादित होते true , इसलिए $row = @mysql_fetch_assoc($result) सत्य लौटाता है।

डेरिक के सवाल के साथ ही।

$foo or $foo = 5;

मूल रूप से है:

$foo or ($foo = 5);

जो मूल रूप से है:

$foo = undefined or ($foo = 5); // $foo = 5 actually returns true

यह भी जो

$foo = undefined or true;

और जैसा कि मैंने पहले उल्लेख किया है, अपरिभाषित = झूठा, इसलिए $ foo = 5 (जैसा कि यह सही कथन है)।

मुझे उम्मीद है कि हर कोई समझ सकता है।


<?php
$foo = false;
$foo or ($foo = '5');
echo $foo;
?>

इसे जांचें आप $foo लिए मान "5" असाइन कर सकते हैं।

तुलना करें or = उच्च प्राथमिकता है .. तथ्य यह है .... :)





or-operator