Логічні оператори, || або АБО?


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
Варто також зазначити, що вони завжди повертають булеве значення, на відміну від багатьох інших мов, де вони повертають останнє перевірене значення. Так у PHP (27 || 0) повертається істина , а не 27 .
TextGeek

@TextGeek, "ці"? 27 or 0повертається 27за мене.
Яніс Елмеріс

@ Jānis Elmeris - ти прав, я мав би посилатися лише на "||" справа.
TextGeek

2
@TextGeek, насправді, ти маєш рацію, що також orповертає булеві. Просто її пріоритет настільки низький, що іноді схоже на те, що він робить щось інше. :) print 27 or 0надрукував би, 27бо orтрапляється після print 27 . До речі, echoне обдуриш - echo 27 or 0виводить 1.
Jānis Elmeris

43

Вони використовуються для різних цілей і фактично мають різні переваги оператора. Оператори &&і ||оператори призначені для булевих умов, тоді як andі orпризначені для управління потоком.

Наприклад, наступне булеве умова:

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

Це відрізняється від контрольного потоку:

doSomething() or die();

die()Функція буде викликана, якщо doSomething()повернеться falseабо null? Що робити, якщо doSomething()повертається trueчи нічого?
giannis christofakis

5
doSomething()оцінюється як булева. Якщо він повертає значення, яке PHP вважає truthy ( 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() || [];

Ви б очікували (як ви звикли, наприклад, від JavaScript), що коли $ this-> положень () повертає помилкові або нульові, $ позиції - це порожній масив. Але це не так. Значення TRUE або FALSE залежить від повернення $ this-> положень ().

Якщо вам потрібно отримати значення $ this-> положень () або порожній масив, ви повинні використовувати:

$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() ?: [];

Перевірено з PHP 7.2.1


це неправильна відповідь, другий приклад працює саме так, як перший
WayFarer

@WayFarer добре, це не правильно (є питання) , але ви помиляєтеся теж (|| і OR не те ж саме) - див мій вибір
Зденек

право, оператори || і 'або' мають різний пріоритет, тому ваш другий приклад працює як: (($ second = returnEmpty ()) або []); Отже, відповідь на оригінальне запитання буде || краще, завжди використовуйте його, поки ви дійсно не зрозумієте, чому ви хочете використовувати "чи"
WayFarer

1
$positions = $this->positions() ?? [];швидше за все, що ви хочете.
єпископ

0

Я не думаю, що один по суті кращий за інший, але я б запропонував дотримуватися || тому що це за замовчуванням у більшості мов.

EDIT: Як вже вказували інші, між ними дійсно є різниця.


0

Немає нічого поганого чи кращого, це просто залежить від переваги операторів. Оскільки ||має вищий пріоритет, ніж orтак, ||в основному використовується.


-3

Деякі мови використовують коротке замикання, а інші використовують повну булеву оцінку (якщо ви знаєте, це аналогічно директиві $Bв Паскалі).

Пояснення:

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

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

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

У цьому прикладі функція B()ніколи не буде виконуватися. Оскільки функція A()повертає TRUE, результат оператора АБО відомий з першої частини без необхідності оцінювати другу частину виразу.

Однак ( A() || B() ), друга частина завжди оцінюється незалежно від значення першої.

Для оптимізованого програмування завжди слід використовувати те, ORщо швидше (за винятком випадків, коли перша частина повертається, falseа друга частина насправді потребує оцінки).


Це не найкраща відповідь !! Прокрутіть назад і візьміть найкращу відповідь, щоб отримати гарне пояснення. З ||, Bне буде називатися. Обидва оператори роблять точно так само, за винятком того, що пріоритет відрізняється.
bzeaman

"Ви завжди повинні використовувати АБО швидше" Хм, мені цікаво, чи це правда ... тому давайте перевіримо, що: 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs Кількість опкодів - це те саме. Тож не має значення продуктивності.
Єнс А. Кох
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.