Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Порядок выполнения оператора if


Автор: maxipub 25.8.2017, 12:21
Добрый день!

Я знаю про приоритеты операторов http://php.net/manual/ru/language.operators.precedence.php

Вопрос немного в другом. Приоритеты это как бы группировка. Как писали в комментарии http://php.net/manual/ru/language.operators.precedence.php :

Код

for example:

<?php $a && $b || $c; ?>
is not the same like
<?php $a AND $b || $c; ?>

the first thing is
(a and b) or c

the second
a and (b or c)


А мой вопрос о том, проверка выполняется слева направо по порядку, т.е. в первом случае сначала "(a and b)", если false то только потом "or c", если true - то "or c" не проверяется, условие уже выполнено. А во втором случае сначала "a", если true, тогда "and (b or c)", если false - то "and (b or c)" не проверяется, т.к. условие уже не выполнимо. Такая логика или как?

Я делал тесты на PHP5.3 - по тестам все вроде так. Слева направо, если условие уже выполнено или уже не выполнимо - дальше ничего не проверяется. Но на деле всегда так или есть нюансы? Так же интересует поведение в PHP7.1

Для примера, можно ли делать так:

Код
if ($file_name = $db->result() && file_exist(ROOT_DIR.$file_name))


?

Меня волнует чтоб file_exist не начал проверяться до $file_name = $db->result(), иначе по очевидным причинам оператор if будет возвращать false. Или лучше разбивать на два оператора if? Лишние строки...

Автор: _zorn_ 25.8.2017, 17:46
Цитата(maxipub @  25.8.2017,  19:21 Найти цитируемый пост)
проверка выполняется слева направо по порядку

Цитата(maxipub @  25.8.2017,  19:21 Найти цитируемый пост)
Я знаю про приоритеты операторов

Взаимоисключающие.

Чтобы не "волноваться" заключайте в скобки. А так судя по вашей же ссылке $file_name будет равен boolean выражению "$db->result() && file_exist(ROOT_DIR.$file_name)"

Чтобы произошло то что вам нужно - "if ( ( $file_name = $db->result() ) && file_exist(ROOT_DIR.$file_name))"

Автор: maxipub 28.8.2017, 17:40
_zorn_, спасибо, но вопрос не о том. smile Ладно, так понял, слева направо всегда.

Автор: _zorn_ 1.9.2017, 18:51
Цитата(maxipub @  29.8.2017,  00:40 Найти цитируемый пост)
Ладно, так понял, слева направо всегда. 

2 + 2 * 2 

Давайте с простого  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)