Operatori logici, || o o?


104

Ricordo di aver letto qualche tempo fa riguardo agli operatori logici che, nel caso di OR, usare ||era meglio di or(o viceversa).

Dovevo solo usarlo nel mio progetto quando mi è tornato in mente, ma non ricordo quale operatore fosse consigliato o se fosse anche vero.

Quale è meglio e perché?

Risposte:


139

Non esiste un "migliore" ma il più comune lo è ||. Hanno una precedenza diversa e ||funzionerebbero come ci si aspetterebbe normalmente.

Vedi anche: Operatori logici ( il seguente esempio è preso da lì ):

// 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 $e = true || $x = 'foo'non definirà a $xcausa del cortocircuito, non a causa di una precedenza più elevata.
Matt Kieran

1
Vale anche la pena notare che questi restituiscono sempre un valore booleano, a differenza di molti altri linguaggi in cui restituiscono l'ultimo valore verificato. Quindi in PHP (27 || 0) restituisce true , non 27 .
TextGeek

@TextGeek, "questi"? 27 or 0ritorna 27per me.
Jānis Elmeris

@ Jānis Elmeris - hai ragione, avrei dovuto fare riferimento solo al "||" Astuccio.
TextGeek

2
@TextGeek, in realtà hai ragione che orrestituisce anche booleano. Solo la sua precedenza è così bassa che a volte sembra che faccia qualcos'altro. :) print 27 or 0verrebbe stampato 27perché oraccade dopo print 27 . BTW, echonon si lascia ingannare - echo 27 or 0sarebbe uscita 1.
Jānis Elmeris

43

Sono utilizzati per scopi diversi e infatti hanno precedenza di operatori diversi. Gli operatori &&e ||sono destinati alle condizioni booleane, mentre ande orsono destinati al flusso di controllo.

Ad esempio, la seguente è una condizione booleana:

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

Questo differisce dal flusso di controllo:

doSomething() or die();

die()verrà chiamata la funzione se doSomething()tornerà falseo null? E se doSomething()ritorni trueo niente?
giannis christofakis

5
doSomething()viene valutato come booleano. Se restituisce un valore che PHP considera veritiero ( true, una stringa non vuota, ecc.), Non chiamerà die().
Matthew Ratzloff

23

La differenza tra rispettivamente || e OR e && e AND è la precedenza dell'operatore :

$bool = FALSE || TRUE;

  • interpretato come ($bool = (FALSE || TRUE))
  • valore di $boolèTRUE

$bool = FALSE OR TRUE;

  • interpretato come (($bool = FALSE) OR TRUE)
  • valore di $boolèFALSE

$bool = TRUE && FALSE;

  • interpretato come ($bool = (TRUE && FALSE))
  • valore di $boolèFALSE

$bool = TRUE AND FALSE;

  • interpretato come (($bool = TRUE) AND FALSE)
  • valore di $boolèTRUE

5

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

Ecco un esempio di codice per lavorare con gli operatori logici:

<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>

Il collegamento è interrotto.
Peter Mortensen

2

So che è un vecchio argomento ma ancora. Ho appena incontrato il problema nel codice che sto eseguendo il debug al lavoro e forse qualcuno potrebbe avere un problema simile ...

Diciamo che il codice ha questo aspetto:

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

Ti aspetteresti (come sei abituato ad esempio da javascript) che quando $ this-> position () restituisce false o null, $ position è un array vuoto. Ma non lo è. Il valore è TRUE o FALSE dipende da cosa restituisce $ this-> position ().

Se hai bisogno di ottenere il valore di $ this-> position () o un array vuoto, devi usare:

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

MODIFICARE:

L'esempio sopra non funziona come previsto, ma la verità è che ||e ornon è la stessa ... Prova questo:

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

Questo è il risultato:

bool(false)
NULL
array(0) {
}

Quindi, in realtà la terza opzione ?:è la soluzione corretta quando si desidera impostare il valore restituito o un array vuoto.

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

Testato con PHP 7.2.1


è una risposta errata, il secondo esempio funziona esattamente come il primo
WayFarer

@ WayFarer beh, non è corretto (c'è un problema) ma anche tu ti sbagli (|| e OR non è lo stesso) - vedi la mia modifica
Zdeněk

giusto, operatori || e "o" hanno una priorità diversa, quindi il secondo esempio funziona come: (($ second = returnEmpty ()) o []); Quindi, la risposta alla domanda originale sarebbe || è meglio,
usalo

1
$positions = $this->positions() ?? [];è probabilmente quello che vuoi.
vescovo

0

Non penso che uno sia intrinsecamente migliore di un altro, ma suggerirei di attenersi a || perché è l'impostazione predefinita nella maggior parte delle lingue.

EDIT: Come altri hanno sottolineato, c'è davvero una differenza tra i due.


0

Non c'è niente di male o meglio, dipende solo dalla precedenza degli operatori. Poiché ||ha una precedenza maggiore di or, quindi ||viene utilizzato principalmente.


-3

Alcuni linguaggi usano il cortocircuito e altri usano la valutazione booleana completa (se lo sai, questo è simile alla direttiva $Bin Pascal).

spiegazioni:

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

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

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

In questo esempio la funzione B()non verrà mai eseguita. Poiché la funzione A()restituisce TRUE, il risultato dell'istruzione OR è noto dalla prima parte senza che sia necessario valutare la seconda parte dell'espressione.

Tuttavia con ( A() || B() ), la seconda parte viene sempre valutata indipendentemente dal valore della prima.

Per una programmazione ottimizzata, dovresti sempre usare ORquale è più veloce (tranne il caso in cui la prima parte ritorna falsee la seconda parte deve essere effettivamente valutata).


Questa non è "La migliore risposta !!". Si prega di scorrere indietro verso l'alto e prendere la risposta più votata per una buona spiegazione. Con il ||, Bnon verrà chiamato. Entrambi gli operatori fanno esattamente lo stesso, tranne per il fatto che la precedenza è diversa.
bzeaman

"dovresti sempre usare OR che è più veloce" Hmm, mi chiedo se questo è vero ... quindi controlliamo che: 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs Il numero di codici operativi è il stesso. Quindi non importa per quanto riguarda le prestazioni.
Jens A. Koch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.