Логические операторы, | / или или?
Я помню, как читал некоторое время назад в отношении логических операторов, что в случае 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)- стоимостью
$boolisFALSE
$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и вторая часть на самом деле должна быть оценена).