В случае сомнений используйте скобки, чтобы сделать условия явными.Таким образом, код будет легче понять позже.
Порядок условий зависит от приоритета оператора, если он тот же, то слева направо.
Однако PHP фактически оптимизирует условия при их обработке.В случае $c1 or $c2
, если $c1
равно true
, значение $c2
не имеет значения, поэтому оно не проверяется.Результат может быть только true
.То же самое происходит для $c1 and $c2
- если $c1
ложно, результатом общего условия может быть только false
.
Так что ($a or $b and $c)
- это то же самое, что и ($a or ($b and $c))
для ожидаемого результата, используйте (($a or $b) and $c)
.
Вот небольшой скрипт, который позволяет вам протестировать его:
// a small function with some debug output
function createConditions(bool ...$values) {
return function($callIndex) use ($values) {
echo 'Call #', $callIndex, "\n";
return $values[$callIndex - 1] ?? false;
};
}
$c = createConditions(true, true, false);
if ($c(1) or $c(2) and $c(3)) {
echo "Result: TRUE\n\n";
} else {
echo "Result: FALSE\n\n";
}
if (($c(1) or $c(2)) and $c(3)) {
echo "Result: TRUE\n\n";
} else {
echo "Result: FALSE\n\n";
}
Выход:
Call #1
Result: TRUE
Call #1
Call #3
Result: FALSE