@entermix

Почему так происходит?

Есть код:

<? if ($new_events = $order->get_new_events_count('comments') > 0): ?>
<?= $new_events; ?>
<? endif; ?>


Возвращает 1

А этот код:

<? if ($order->get_new_events_count('comments') > 0): ?>
<?= $order->get_new_events_count('comments'); ?>
<? endif; ?>


Возвращает 2, почему так?

P.S. Функция $order->get_new_events_count('comments') всегда возвращает число 2, т.е. никаких инкриметнов быть не может
  • Вопрос задан
  • 192 просмотра
Решения вопроса 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Потому что в первом случае вы в $new_events присваиваете результат сравнения $order->get_new_events_count('comments') > 0 (это может быть true или false).

echo true;  // выведет "1"
echo false; // выведет "" (пустую строку).

Поэтому, какое бы число ни возвращала функция get_new_events_count, если оно больше 0 - всегда будет выводиться цифра 1.

Правильно делать так:
<?php
$new_events = $order->get_new_events_count('comments');
?>
<?php if ($new_events > 0): ?>
    <?= $new_events; ?>
<?php endif; ?>


Можно было бы написать то же самое вот так:
<? if (($new_events = $order->get_new_events_count('comments')) > 0): ?>
    <?= $new_events; ?>
<? endif; ?>

Но, сами видите, в таком коде легко допустить ошибку. Присвоение внутри оператора сравнения считается плохой практикой, помимо проблем с порядком выполнения нередки ситуации, когда разработчик пишет if ($foo = $bar), вместо if ($foo == $bar)

А во втором в if выполняется нормальная проверка, но функция get_new_events_count вызывается дважды, вы, судя по всему, именно этого хотите избежать.
Ответ написан
Комментировать
Denormalization
@Denormalization
Приоритет операторов неправильный.

Оно работает вот так:
if ( $new_events = ( $order->get_new_events_count('comments') > 0 ) )

Т.е в $new_events у нас true -> который приобразуется в 1 при выводе.
Ответ написан
Комментировать
In4in
@In4in
°•× JavaScript Developer ^_^ ו°
Немного скобок и все в порядке
<? if (($new_events = $order->get_new_events_count('comments')) > 0): ?>
<?= $new_events; ?>
<? endif; ?>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы