Логические операторы, | / или или?
Я помню, как читал некоторое время назад в отношении логических операторов, что в случае OR
, используя ||
лучше, чем or
(или наоборот).
Я просто должен был использовать это в моем проекте, когда она вернулась ко мне, но я не помню какой оператор был рекомендован или если это было даже правдой.
что лучше и почему?
8 ответов:
нет "лучше", но более распространенным является
||
. У них разные приоритет и||
будет работать как обычно.Читайте также: логические операторы (следующий пример взят оттуда):
// 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;
они используются для разных целей и на самом деле имеют разные прецеденты оператора. Элемент
&&
и||
операторы предназначены для булевых условий, тогда какand
иor
предназначены для управления потоком.например, следующее логическое условие:
if ($foo == $bar && $baz != $quxx) {
это отличается от потока управления:
doSomething() or die();
разница между соответственно || и или и && И и является приоритет операторов:
$bool = FALSE || TRUE;
- трактуется как
($bool = (FALSE || TRUE))
- стоимостью
$bool
иTRUE
$bool = FALSE OR TRUE;
- трактуется как
(($bool = FALSE) OR TRUE)
- стоимостью
$bool
isFALSE
$bool = TRUE && FALSE;
- трактуется как
($bool = (TRUE && FALSE))
- стоимостью
$bool
иFALSE
$bool = TRUE AND FALSE;
- трактуется как
(($bool = TRUE) AND FALSE)
- стоимостью
$bool
иTRUE
Источник:http://bit.ly/1hxDmVR
вот пример кода для работы с логическими операторами:
<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>
Я не думаю, что один по своей сути лучше, чем другой, но я бы предложил придерживаться||, потому что это значение по умолчанию в большинстве языков.
EDIT: как указывали другие, между ними действительно есть разница.
там нет ничего плохого или лучше, это просто зависит от приоритета операторов. Так как
||
имеет более высокий приоритет, чемor
, Так что||
в основном используется.
Я знаю, что это старая тема но все же. Я только что встретил проблему в коде, который я отлаживаю на работе, и, возможно, у кого-то может быть аналогичная проблема...
допустим, код выглядит так:
$positions = $this->positions() || [];
вы ожидаете (как вы привыкли, например, к javascript), что когда $this->positions () возвращает false или null, $positions-пустой массив. Значение TRUE или FALSE зависит от того, что возвращает $this->positions ().
Если вам нужно получить значение из $this - >positions() или пустого массива, вы должны использовать:
$positions = $this->positions() or [];
EDIT:
приведенный выше пример не работает по назначению, но правда в том, что
||
и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
некоторые языки используют либо короткое замыкание, другие используют полную логическую оценку (если вы знаете, это похоже на директиву
$B
в Паскале)объяснениями:
function A(){ ...do somethings.. return true; } function B(){ ...do somethings.. return true; } if ( A() OR B() ) { .....
в этом примере функция
B()
никогда не будет выполнена. Так как функцияA()
возвращает TRUE, результат оператора OR известен из первой части без необходимости оценивать вторую часть выражения.вместе с
( A() || B() )
, второй часть всегда оценивается независимо от значения первого.для оптимизированного программирования, вы всегда должны использовать
OR
что быстрее (за исключением случая, когда первая часть возвращаетfalse
и вторая часть на самом деле должна быть оценена).