Логические операторы, | / или или?
Я помню, что читал некоторое время назад в отношении логических операторов, которые в случае 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;
они используются для разных целей и фактически имеют разные прецеденты операторов. The &&
и ||
операторы предназначены для булевых условий, тогда как 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
, so ||
в основном используется.
Я знаю, что это старая тема но все же. Я только что встретил проблему в коде, который я отлаживаю на работе, и, возможно, у кого-то может быть аналогичная проблема...
допустим, код выглядит так:
$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
in pascal)
объяснениями:
function A(){
...do somethings..
return true;
}
function B(){
...do somethings..
return true;
}
if ( A() OR B() ) { .....
в этом примере функция B()
никогда не будет выполнена. Так как функция A()
возвращает TRUE, результат оператора OR известен из первой части без необходимости оценки второй части выражения.
вместе с ( A() || B() )
, второй деталь всегда оценивается независимо от значения первой.
для оптимизированного программирования вы всегда должны использовать OR
что быстрее (за исключением случая, когда первая часть возвращает false
и вторая часть действительно должна быть оценена).