На каком этапе останавливается проверка с операторами AND?

Вероломство

PHP:
  1. $referer_id = 0; // нет входящего параметра (рефссылки)
  2.  
  3. if ($referer_id and !isset($_SESSION[‘referer_id’]) and User::findOne($referer_id)) {/* какой-то код */}
  4.  
  5. // смотрим массив запросов
  6. debug(Db::$queries); // array (size=0) empty
  7.  
  8.  
  9. $referer_id = 1; // есть входящий параметр (рефссылка)
  10.  
  11. if ($referer_id and !isset($_SESSION[‘referer_id’]) and User::findOne($referer_id)) {/* какой-то код */}
  12.  
  13. // смотрим массив запросов
  14. 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

Вероломство

И при чём тут типы и логический оператор AND?

Запрос почему в первом ифе не отработал?

 

ADSoft

Это механизм оптимизации, короткое вычисление логического результата. Если первое ложь — дальше не вычисляется, зачем? Все равно результат будет тоже ложь…., Если не первое условие то второе, третье итд до последнего

 

MouseZver

PHP:
  1. <?php
  2.  
  3.  
  4. function test()
  5. {
  6.     var_dump (1);
  7.    
  8.     return 1;
  9. }
  10.  
  11. function test2()
  12. {
  13.     var_dump (2);
  14.    
  15.     return null;
  16. }
  17.  
  18. function test3()
  19. {
  20.     var_dump (3);
  21.    
  22.     return 3;
  23. }
  24.  
  25. if ( test() AND test2() AND test3() )
  26. {
  27.    
  28. }
  29.  
  30. echo ‘————‘ . PHP_EOL;
  31.  
  32. var_dump(true && false); // false
  33.  
  34. var_dump(true and false); // false
  35.  
  36. $v = true and false;
  37. var_dump($v); // true

Оператор AND — низкий приоритет

 

ADSoft

а если

PHP:
  1. $v = true && false; // false
 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *