Логические операторы, || или или?


105

Я помню, как некоторое время назад читал о логических операторах, которые в случае ORиспользования ||были лучше or(или наоборот).

Мне просто пришлось использовать это в своем проекте, когда он вернулся ко мне, но я не могу вспомнить, какой оператор был рекомендован или было ли это правда.

Что лучше и почему?

Ответы:


140

Нет «лучше», но есть более распространенный вариант ||. У них разный приоритет, и они ||будут работать, как и следовало ожидать в обычном режиме.

См. Также: Логические операторы ( оттуда взят следующий пример ):

// 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) возвращает true , а не 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.
Янис Элмерис

43

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

Например, следующее логическое условие:

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

Это отличается от потока управления:

doSomething() or die();

die()функция будет вызвана, если doSomething()вернется falseили null? Что делать, если doSomething()вернется trueили ничего?
Яннис Христофакис 01

5
doSomething()оценивается как логическое значение. Если он возвращает значение, которое PHP считает истинным ( trueнепустая строка и т. Д.), Он не будет вызывать die().
Мэтью Ратцлофф 01

23

Разница между соответственно || и OR, и &&, и AND - приоритет оператора :

$bool = FALSE || TRUE;

  • интерпретируется как ($bool = (FALSE || TRUE))
  • Значение $boolISTRUE

$bool = FALSE OR TRUE;

  • интерпретируется как (($bool = FALSE) OR TRUE)
  • Значение $boolISFALSE

$bool = TRUE && FALSE;

  • интерпретируется как ($bool = (TRUE && FALSE))
  • Значение $boolISFALSE

$bool = TRUE AND FALSE;

  • интерпретируется как (($bool = TRUE) AND FALSE)
  • Значение $boolISTRUE

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-> position () возвращает false или null, $ position является пустым массивом. Но это не так. Значение TRUE или FALSE зависит от того, что возвращает $ this-> position ().

Если вам нужно получить значение $ this-> position () или пустой массив, вы должны использовать:

$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 ну, это неверно (есть проблема), но вы тоже ошибаетесь (|| и ИЛИ - это не одно и то же) - см. Мою правку
Зденек

правильно, операторы || и 'или' имеют разные приоритеты, поэтому ваш второй пример работает как: (($ second = returnEmpty ()) или []); Итак, ответ на исходный вопрос будет || лучше, всегда используйте его, пока вы действительно не поймете, почему вы хотите использовать 'или'
WayFarer

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 Количество кодов операций - это тем же. Так что с точки зрения производительности это не имеет значения.
Jens A. Koch
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.