Вероломство
PHP:
$referer_id = 0; // нет входящего параметра (рефссылки) if ($referer_id and !isset($_SESSION[‘referer_id’]) and User::findOne($referer_id)) {/* какой-то код */} // смотрим массив запросов debug(Db::$queries); // array (size=0) empty $referer_id = 1; // есть входящий параметр (рефссылка) if ($referer_id and !isset($_SESSION[‘referer_id’]) and User::findOne($referer_id)) {/* какой-то код */} // смотрим массив запросов debug(Db::$queries); // array (size=1) 0 => string ‘select * from `user` where `id` = ?’ (length=35)У меня вопрос: на каком этапе в первом случае остановилась проверка, если я не вижу запроса в дебаге?
Ведь условие же — AND, разве не должен отработать запрос, чтобы узнать, выполняется ли условие?
p.s. мне как бы при 0 не надо запрос, как бы работает всё правильно, но ПОЧЕМУ НЕТ запроса для проверки, условие остановилось на if (referer_id) и раз она 0, то отлуп пошёл?
В документации не нахожу описания оператора AND, в котором было бы описано поведение или какая-то очерёдность, там просто: если все true, то всё нормально, иначе отлуп, НУ ТАК где проверка запроса на true, запрос где, почему до него не дошла проверка?
Вероломство
типа если первое из условий не true, то отлуп, так как не имеет смысла дальше проверять?
Artur_hopf
@Вероломство что вы там не нашли?
https://www.php.net/manual/ru/types.comparisons.php
Вероломство
И при чём тут типы и логический оператор AND?
Запрос почему в первом ифе не отработал?
ADSoft
Это механизм оптимизации, короткое вычисление логического результата. Если первое ложь — дальше не вычисляется, зачем? Все равно результат будет тоже ложь…., Если не первое условие то второе, третье итд до последнего
MouseZver
PHP:
<?php function test() { return 1; } function test2() { return null; } function test3() { return 3; } if ( test() AND test2() AND test3() ) { } echo ‘————‘ . PHP_EOL; $v = true and false;Оператор AND — низкий приоритет
ADSoft
а если
PHP:
$v = true && false; // false