লজিকাল অপারেটর, || বা বা?


104

আমি মনে করি কিছুক্ষণ আগে লজিকাল অপারেটরদের ক্ষেত্রে পড়া ORব্যবহার করার ক্ষেত্রে (বা বিপরীতে) এর ||চেয়ে ভাল ছিল or

আমার প্রকল্পটি আমার কাছে ফিরে এলে আমাকে এটি ব্যবহার করতে হয়েছিল, তবে কোন অপারেটরের প্রস্তাব দেওয়া হয়েছিল বা এটি এমনকি সত্য ছিল তা আমি মনে করতে পারি না।

কোনটি ভাল এবং কেন?

উত্তর:


139

এখানে "আরও ভাল" নেই তবে আরও সাধারণ একটি ||। এগুলির আলাদা নজির রয়েছে এবং তারা ||যেমন প্রত্যাশা করেন তার মতো কাজ করবে।

আরও দেখুন: লজিকাল অপারেটরগুলি ( নিম্নলিখিত উদাহরণটি সেখান থেকে নেওয়া হয়েছে ):

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;

11
এবং সংক্ষিপ্ত-সার্কিটের কারণে $e = true || $x = 'foo'সংজ্ঞা দেওয়া হবে না $x, উচ্চতর নজিরের কারণে নয়।
ম্যাট কিয়েরান

1
এটিও লক্ষণীয় যে এগুলি সর্বদা বুলেটিয়ান মানটি প্রদান করে, অন্য অনেক ভাষার মতো নয় যেখানে তারা চেক করা শেষ মানটি দেয়। পিএইচপি সুতরাং (27 || 0) ফেরৎ সত্য , না 27
পাঠ্যদর্শন

@ টেক্সটগীক, "এগুলি"? আমার জন্য 27 or 0প্রত্যাবর্তন 27
জনিস এলমারিস

@ জিনিস এলমারিস - আপনি সঠিক, আমার কেবল "" "উল্লেখ করা উচিত ছিল কেস।
টেক্সটগীক

2
@ টেক্সটগীক, আসলে আপনি ঠিক বলেছেন যে orবুলিয়ানও ফিরে আসে। কেবল এর প্রাধান্য এত কম যে এটি কখনও কখনও দেখে মনে হয় এটি অন্য কিছু করে। :) পরেprint 27 or 0 মুদ্রণ হবে 27কারণ orঘটে । বিটিডাব্লু, বোকা নয় - আউটপুট হবে । print 27echoecho 27 or 01
জোনিস এলমারিস

43

এগুলি বিভিন্ন উদ্দেশ্যে ব্যবহৃত হয় এবং বাস্তবে বিভিন্ন অপারেটরের নজির রয়েছে। &&এবং ||অপারেটর, বুলিয়ান অবস্থার জন্য উদ্দেশ্যে হয় যেহেতু andএবং orনিয়ন্ত্রণ প্রবাহের জন্য উদ্দেশ্যে হয়।

উদাহরণস্বরূপ, নীচে একটি বুলিয়ান শর্ত:

if ($foo == $bar && $baz != $quxx) {

এটি নিয়ন্ত্রণ প্রবাহ থেকে পৃথক:

doSomething() or die();

die()ফাংশন ডাকা doSomething()হবে যদি ফিরে আসবে falseনাকি null? যদি doSomething()ফিরে আসে trueবা কিছুই না?
জিয়ানিস ক্রিস্টোফাকিস

5
doSomething()বুলিয়ান হিসাবে মূল্যায়ন করা হয়। যদি এটি পিএইচপি সত্যবাদী ( true, একটি খালি খালি স্ট্রিং ইত্যাদি) বিবেচনা করে এমন কোনও মান দেয় তবে এটি কল করবে না die()
ম্যাথু র্যাটজলফ

23

যথাক্রমে পার্থক্য || এবং ওআর এবং&& এবং AND অপারেটর অগ্রাধিকার :

$bool = FALSE || TRUE;

  • হিসাবে ব্যাখ্যা করা ($bool = (FALSE || TRUE))
  • মান $boolহয়TRUE

$bool = FALSE OR TRUE;

  • হিসাবে ব্যাখ্যা করা (($bool = FALSE) OR TRUE)
  • মান $boolহয়FALSE

$bool = TRUE && FALSE;

  • হিসাবে ব্যাখ্যা করা ($bool = (TRUE && FALSE))
  • মান $boolহয়FALSE

$bool = TRUE AND FALSE;

  • হিসাবে ব্যাখ্যা করা (($bool = TRUE) AND FALSE)
  • মান $boolহয়TRUE

5

সূত্র: http://wallstreetdeveloper.com/php-logical-operators/

লজিকাল অপারেটরদের সাথে কাজ করার জন্য নমুনা কোডটি এখানে:

<html>

<head>
    <title>Logical</title>
</head>

<body>
    <?php
        $a = 10;
        $b = 20;
        if ($a>$b)
        {
            echo " A is Greater";
        }
        elseif ($a<$b)
        {
            echo " A is lesser";
        }
        else
        {
             echo "A and B are equal";
        }
    ?>
    <?php
        $c = 30;
        $d = 40;
        //if (($a<$c) AND ($b<$d))
        if (($a<$c) && ($b<$d))
        {
            echo "A and B are larger";
        }
        if (isset($d))
            $d = 100;
        echo $d;
        unset($d);
    ?>
    <?php
        $var1 = 2;
        switch($var1)
        {
            case 1:  echo "var1 is 1";
                     break;
            case 2:  echo "var1 is 2";
                     break;
            case 3:  echo "var1 is 3";
                     break;
            default: echo "var1 is unknown";
        }
    ?>
</body>
</html>

লিঙ্কটি নষ্ট হয়ে গেছে।
পিটার মর্টেনসেন

2

আমি জানি এটি একটি পুরানো বিষয় তবে এখনও। আমি কোডে কাজটি করতে গিয়ে ডিবাগ করছি ঠিক তখনই সমস্যাটি পেয়েছি এবং কারও কারও সাথে একই সমস্যা থাকতে পারে ...

কোডটি এর মতো দেখায় বলে দিন:

$positions = $this->positions() || [];

আপনি প্রত্যাশা করবেন (যেমন আপনি যেমন জাভাস্ক্রিপ্ট থেকে অভ্যস্ত) যে যখন-এই-> অবস্থানগুলি () মিথ্যা বা নাল ফেরায়, $ অবস্থান খালি অ্যারে হয়। তবে তা হয় না। মান সত্য বা মিথ্যা depends এই-> অবস্থানগুলি () কী দেয় তার উপর নির্ভর করে।

আপনার যদি $ এটি-> পজিশনের () বা খালি অ্যারের মান পেতে হয় তবে আপনাকে ব্যবহার করতে হবে:

$positions = $this->positions() or [];

সম্পাদনা করুন:

উপরের উদাহরণটি ইচ্ছাকৃতভাবে কাজ করে না তবে সত্যটি হ'ল ||এবং orএকই নয় ... এটি চেষ্টা করুন:

<?php

function returnEmpty()
{
  //return "string";
  //return [1];
  return null;
}

$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];

var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";

এটি ফলাফল:

bool(false)
NULL
array(0) {
}

সুতরাং, আসলে তৃতীয় বিকল্পটি ?:হ'ল সঠিক সমাধান যখন আপনি ফিরে মান বা খালি অ্যারে সেট করতে চান।

$positions = $this->positions() ?: [];

পিএইচপি 7.2.1 সঙ্গে পরীক্ষিত


এটি ভুল উত্তর, দ্বিতীয় উদাহরণটি ঠিক প্রথমটির মতো কাজ করে
ওয়েফায়ার

@ ওয়েফফেয়ার ভাল, এটি সঠিক নয় (একটি সমস্যা রয়েছে) তবে আপনিও ভুল (|| এবং ওআরও এক নয়) - আমার সম্পাদনা দেখুন
জেডেনেক

ডান, অপারেটর || এবং 'বা' এর আলাদা আলাদা অগ্রাধিকার রয়েছে, সুতরাং, আপনার দ্বিতীয় উদাহরণটি এই হিসাবে কাজ করে: (($ দ্বিতীয় = রিটার্ন এমপি ()) বা []); সুতরাং, আসল প্রশ্নের উত্তরটি হবে || ভাল, সর্বদা এটি ব্যবহার করুন, যতক্ষণ না আপনি সত্যিই বুঝতে পারেন কেন আপনি 'বা' ব্যবহার করতে চান
11:51 ওয়েফায়ার

1
$positions = $this->positions() ?? [];সম্ভবত আপনি কি চান।
বিশপ

0

আমি মনে করি না যে একজন অন্যজনের চেয়ে স্বভাবগতভাবেই ভাল, তবে আমি || কারণ এটি বেশিরভাগ ভাষায় ডিফল্ট।

সম্পাদনা: অন্যরা যেমন উল্লেখ করেছে যে দুজনের মধ্যে আসলেই পার্থক্য রয়েছে।


0

খারাপ বা এর চেয়ে ভাল কিছুই নেই, এটি কেবল অপারেটরদের নজিরগুলির উপর নির্ভর করে। যেহেতু ||এর চেয়ে বেশি প্রাধান্য রয়েছে orতাই ||বেশিরভাগ ক্ষেত্রেই ব্যবহৃত হয়।


-3

কিছু ভাষাগুলি শর্ট সার্কিট ব্যবহার করে এবং অন্যেরা পুরো বুলিয়ান মূল্যায়ন ব্যবহার করে (যদি আপনি জানেন তবে এটি পাস্কেলের নির্দেশের মতো $B)।

ব্যাখ্যা:

function A(){
    ...Do something..
    return true;
}

function B(){
    ...Do something..
    return true;
}

if ( A() OR B() ) { .....

এই উদাহরণে ফাংশনটি B()কখনই কার্যকর করা হবে না। যেহেতু ফাংশনটি A()সত্য দেয়, তাই ওআর বিবৃতিটির ফলাফলটি প্রথম অংশ থেকে প্রকাশের দ্বিতীয় অংশটি মূল্যায়ন করার প্রয়োজন ছাড়াই জানা যায়।

তবে এর সাথে ( A() || B() ), দ্বিতীয় অংশটি সর্বদা প্রথমটির মান নির্বিশেষে মূল্যায়ন করা হয়।

অপ্টিমাইজড প্রোগ্রামিংয়ের জন্য আপনার সর্বদা ORদ্রুত ব্যবহার করা উচিত (প্রথম অংশটি যখন ফিরে আসে falseএবং দ্বিতীয় অংশটি আসলে মূল্যায়ন করা প্রয়োজন তখন কেস বাদে )।


এটি 'সেরা উত্তর !!' নয়। একটি ভাল ব্যাখ্যার জন্য দয়া করে পিছনে স্ক্রোল করুন এবং সর্বাধিক আপ করা ভোট গ্রহণ করুন। সাথে ||, Bডাকা হবে না। উভয় অপারেটর একেবারে একই কাজ করে, অগ্রাধিকারটি পৃথক হওয়া ব্যতীত।
bzeaman

"আপনার সবসময় ওআরটি সর্বদা দ্রুত ব্যবহার করা উচিত" হুম, ভাবছি এটি সত্য কিনা ... তবে আসুন এটি পরীক্ষা করা যাক: 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs অপকডের সংখ্যাটি হ'ল একই। সুতরাং এটি পারফরম্যান্স বুদ্ধিমানের বিষয় নয়।
জেনস এ। কোচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.