Operatory logiczne, || albo albo?


105

Pamiętam, jak kiedyś czytałem o operatorach logicznych, które w przypadku ORużycia ||były lepsze niż or(lub odwrotnie).

Po prostu musiałem to wykorzystać w moim projekcie, kiedy do mnie wróciło, ale nie pamiętam, który operator został polecony, ani czy to w ogóle prawda.

Który jest lepszy i dlaczego?

Odpowiedzi:


140

Nie ma „lepszego”, ale jest bardziej powszechne ||. Mają inny priorytet i ||będą działać tak, jak można by się normalnie spodziewać.

Zobacz także: Operatory logiczne ( poniższy przykład jest stąd wzięty ):

// 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
i $e = true || $x = 'foo'nie zdefiniuje z $xpowodu zwarcia, nie z powodu wyższego priorytetu.
Matt Kieran,

1
Warto również zauważyć, że zawsze zwracają one wartość logiczną, w przeciwieństwie do wielu innych języków, w których zwracają ostatnią zaznaczoną wartość. Więc w PHP (27 || 0) zwraca prawdę , a nie 27 .
TextGeek

@TextGeek, „te”? 27 or 0wraca 27po mnie.
Jānis Elmeris

@ Jānis Elmeris - masz rację, powinienem był odnieść się tylko do „||” walizka.
TextGeek

2
@TextGeek, właściwie, masz rację, orzwracając również wartość logiczną. Po prostu jego pierwszeństwo jest tak niskie, że czasami wygląda na to, że robi coś innego. :) print 27 or 0zostanie wydrukowane, 27ponieważ ornastąpi później print 27 . BTW, echonie daje się nabrać - echo 27 or 0wyjdzie 1.
Jānis Elmeris

43

Są używane do różnych celów iw rzeczywistości mają różne priorytety operatorów. &&I ||operatorów logicznych przeznaczone do warunków, przy czym andi orsą przeznaczone do sterowania przepływem.

Na przykład następujący warunek jest logiczny:

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

Różni się to od przepływu sterowania:

doSomething() or die();

die()funkcja zostanie wywołana, jeśli doSomething()zwróci falselub null? Co jeśli doSomething()wróci truelub nic?
giannis christofakis

5
doSomething()jest oceniany jako wartość logiczna. Jeśli zwraca wartość, którą PHP uważa za prawdziwą ( trueniepusty ciąg znaków itp.), Nie wywoła die().
Matthew Ratzloff

23

Różnica między odpowiednio || oraz OR i && i AND to pierwszeństwo operatorów :

$bool = FALSE || TRUE;

  • interpretowane jako ($bool = (FALSE || TRUE))
  • wartość $boolwynosiTRUE

$bool = FALSE OR TRUE;

  • interpretowane jako (($bool = FALSE) OR TRUE)
  • wartość $boolwynosiFALSE

$bool = TRUE && FALSE;

  • interpretowane jako ($bool = (TRUE && FALSE))
  • wartość $boolwynosiFALSE

$bool = TRUE AND FALSE;

  • interpretowane jako (($bool = TRUE) AND FALSE)
  • wartość $boolwynosiTRUE

5

Źródło: http://wallstreetdeveloper.com/php-logical-operators/

Oto przykładowy kod do pracy z operatorami logicznymi:

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

Link jest uszkodzony.
Peter Mortensen

2

Wiem, że to stary temat, ale jednak. Właśnie spotkałem się z problemem w kodzie, który debuguję w pracy i może ktoś może mieć podobny problem ...

Powiedzmy, że kod wygląda następująco:

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

Można by się spodziewać (jak przyzwyczaiłeś się np. Z javascript), że gdy $ this-> position () zwróci false lub null, to $ position jest pustą tablicą. Ale tak nie jest. Wartość PRAWDA lub FAŁSZ zależy od tego, co zwraca $ this-> position ().

Jeśli chcesz uzyskać wartość $ this-> position () lub pustą tablicę, musisz użyć:

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

EDYTOWAĆ:

Powyższy przykład nie działa zgodnie z przeznaczeniem, ale prawda jest taka, że ||i ornie jest to samo ... Spróbuj tego:

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

Oto wynik:

bool(false)
NULL
array(0) {
}

Tak więc w rzeczywistości trzecia opcja ?:jest poprawnym rozwiązaniem, gdy chcesz ustawić zwracaną wartość lub pustą tablicę.

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

Testowane w PHP 7.2.1


to jest niepoprawna odpowiedź, drugi przykład działa dokładnie tak samo jak pierwszy
WayFarer

@WayFarer no cóż, to nie jest poprawne (jest problem), ale też się mylisz (|| i OR to nie to samo) - zobacz moją edycję
Zdeněk

racja, operatory || i „or” mają inny priorytet, więc Twój drugi przykład działa jako: (($ second = returnEmpty ()) or []); Zatem odpowiedź na pierwotne pytanie byłaby || jest lepszy, zawsze go używaj, dopóki naprawdę nie zrozumiesz, dlaczego chcesz go użyć ”lub”
WayFarer

1
$positions = $this->positions() ?? [];jest prawdopodobnie tym, czego chcesz.
biskup

0

Nie sądzę, aby jeden był z natury lepszy od drugiego, ale sugerowałbym trzymać się || ponieważ jest to ustawienie domyślne w większości języków.

EDYCJA: Jak zauważyli inni, rzeczywiście istnieje różnica między nimi.


0

Nie ma nic złego ani lepszego, zależy to tylko od pierwszeństwa operatorów. Ponieważ ||ma wyższy priorytet niż or, więc ||jest najczęściej używany.


-3

Niektóre języki używają zwarcia, a inne używają pełnej oceny logicznej (jeśli wiesz, jest to podobne do dyrektywy $B w Pascalu).

Objaśnienia:

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

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

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

W tym przykładzie funkcja B()nigdy nie zostanie wykonana. Ponieważ funkcja A()zwraca wartość PRAWDA, wynik instrukcji OR jest znany z pierwszej części bez konieczności obliczania drugiej części wyrażenia.

Jednak w ( A() || B() )przypadku drugiej części jest zawsze oceniana niezależnie od wartości pierwszej.

Aby zoptymalizować programowanie, zawsze powinieneś używać tego, ORco jest szybsze (z wyjątkiem przypadku, gdy pierwsza część jest zwracana, falsea druga część musi być faktycznie oceniona).


To nie jest „Najlepsza odpowiedź !!”. Przewiń z powrotem w górę i wybierz najbardziej głosowaną odpowiedź, aby uzyskać dobre wyjaśnienie. Z ||, Bnie zostanie wywołany. Oba operatory robią dokładnie to samo, z wyjątkiem tego, że pierwszeństwo jest inne.
bzeaman

„Zawsze powinieneś używać LUB, które jest szybsze” Hmm, zastanawiam się, czy to prawda ... więc sprawdźmy, czy: 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs Liczba opkodów to podobnie. Więc nie ma znaczenia, jeśli chodzi o wydajność.
Jens A. Koch
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.