Operadores lógicos, || ou ou?

104

Eu me lembro de ter lido um tempo atrás a respeito de operadores lógicos que no caso de OR, using ||era melhor do que or(ou vice-versa).

Eu só tive que usar isso no meu projeto quando ele voltou para mim, mas não consigo lembrar qual operador foi recomendado ou se era mesmo verdade.

Qual é melhor e por que?

ItsPronounce
fonte

Respostas:

139

Não há "melhor", mas o mais comum é ||. Eles têm precedências diferentes e ||funcionariam normalmente.

Consulte também: Operadores lógicos ( o exemplo a seguir é tirado daí ):

// 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;
Felix Kling
fonte
11
e $e = true || $x = 'foo'não definirá $xpor causa de curto-circuito, não por causa de maior precedência.
Matt Kieran
1
Também é importante notar que estes sempre retornam um valor booleano, ao contrário de muitas outras linguagens onde retornam o último valor verificado. Portanto, em PHP (27 || 0) retorna verdadeiro , não 27 .
TextGeek de
@TextGeek, "estes"? 27 or 0retorna 27para mim.
Jānis Elmeris
@ Jānis Elmeris - você está correto, eu deveria ter me referido apenas ao "||" caso.
TextGeek
2
@TextGeek, na verdade, você está certo ao dizer que orretorna booleano também. Apenas sua precedência é tão baixa que às vezes parece que faz outra coisa. :) print 27 or 0imprimiria 27porque oracontece depois print 27 . BTW, echonão se engane - echo 27 or 0seria a saída 1.
Jānis Elmeris
43

Eles são usados ​​para finalidades diferentes e, na verdade, têm precedências de operador diferentes. Os operadores &&e ||destinam-se a condições booleanas, enquanto ande ordestinam-se ao fluxo de controle.

Por exemplo, o seguinte é uma condição booleana:

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

Isso difere do fluxo de controle:

doSomething() or die();
Matthew Ratzloff
fonte
die()a função será chamada se doSomething()retornará falseou null? E se doSomething()retornar trueou nada?
giannis christofakis
5
doSomething()é avaliado como booleano. Se ele retornar um valor que o PHP considera verdadeiro ( trueuma string não vazia, etc.), ele não chamará die().
Matthew Ratzloff
23

A diferença entre respectivamente || e OR e && e AND é a precedência do operador :

$bool = FALSE || TRUE;

  • interpretado como ($bool = (FALSE || TRUE))
  • valor de $booléTRUE

$bool = FALSE OR TRUE;

  • interpretado como (($bool = FALSE) OR TRUE)
  • valor de $booléFALSE

$bool = TRUE && FALSE;

  • interpretado como ($bool = (TRUE && FALSE))
  • valor de $booléFALSE

$bool = TRUE AND FALSE;

  • interpretado como (($bool = TRUE) AND FALSE)
  • valor de $booléTRUE
John Slegers
fonte
5

Fonte: http://wallstreetdeveloper.com/php-logical-operators/

Aqui está um exemplo de código para trabalhar com operadores lógicos:

<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>
improgrammer
fonte
O link está quebrado.
Peter Mortensen
2

Eu sei que é um assunto antigo, mas ainda assim. Acabei de encontrar o problema no código que estou depurando no trabalho e talvez alguém possa ter um problema semelhante ...

Digamos que o código seja assim:

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

Você esperaria (como está acostumado a fazer, por exemplo, em javascript) que quando $ this-> position () retornasse falso ou nulo, $ position fosse um array vazio. Mas não é. O valor é TRUE ou FALSE depende do que $ this-> position () retorna.

Se você precisa obter o valor de $ this-> posições () ou array vazio, você tem que usar:

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

EDITAR:

O exemplo acima não funciona como pretendido, mas a verdade é que ||e ornão é o mesmo ... Tente isto:

<?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";

Este é o resultado:

bool(false)
NULL
array(0) {
}

Portanto, na verdade, a terceira opção ?:é a solução correta quando você deseja definir o valor retornado ou o array vazio.

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

Testado com PHP 7.2.1

Zdeněk
fonte
é uma resposta incorreta, o segundo exemplo funciona exatamente como o primeiro
WayFarer
@WayFarer bem, não está correto (há um problema), mas você também está errado (|| e OR não é o mesmo) - veja minha edição
Zdeněk
certo, operadores || e 'ou' têm prioridade diferente, então, seu segundo exemplo funciona como: (($ second = returnEmpty ()) ou []); Portanto, a resposta à pergunta original seria || é melhor, sempre use-o, até que você realmente entenda por que deseja usar 'ou'
WayFarer
1
$positions = $this->positions() ?? [];é provavelmente o que você deseja.
bispo de
0

Não acho que um seja inerentemente melhor do que outro, mas sugiro ficar com || porque é o padrão na maioria dos idiomas.

EDIT: Como outros apontaram, realmente há uma diferença entre os dois.

exahex
fonte
0

Não há nada de ruim ou melhor, depende apenas da precedência dos operadores. Uma vez que ||tem precedência mais alta que or, então ||é mais usado.

Nishu Tayal
fonte
-3

Algumas linguagens usam curto-circuito, e outras usam avaliação booleana completa (se você sabe, isso é semelhante à diretiva $B em Pascal).

Explicações:

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

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

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

Neste exemplo, a função B()nunca será executada. Como a função A()retorna TRUE, o resultado da instrução OR é conhecido desde a primeira parte sem que seja necessário avaliar a segunda parte da expressão.

No entanto ( A() || B() ), com , a segunda parte é sempre avaliada independentemente do valor da primeira.

Para uma programação otimizada, você deve sempre usar o ORque é mais rápido (exceto no caso em que a primeira parte retorna falsee a segunda parte realmente precisa ser avaliada).

janhsh
fonte
Esta não é 'A melhor resposta !!'. Role para cima e pegue a resposta mais votada para uma boa explicação. Com o ||, Bnão será chamado. Ambos os operadores fazem exatamente o mesmo, exceto que a precedência é diferente.
bzeaman
"você deve sempre usar OR, que é mais rápido" Hmm, eu me pergunto se isso é verdade ... então vamos verificar se: 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs O número de opcodes é o mesmo. Portanto, não importa o desempenho.
Jens A. Koch