За последние 24 часа нас посетили 8533 программиста и 494 робота. Сейчас ищут 194 программиста ...

Это баг или фича?

Тема в разделе "PHP для новичков", создана пользователем Yankovitz, 21 сен 2020.

  1. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    187
    Симпатии:
    6
    Привет, есть 2 похожих условия:
    Код (Text):
    1. if ( $this->coupon_count == 1 && $coupons = $this->user_has_coupon() ) {
    2.     print_r( $coupons ); // возвращает результат из $this->user_has_coupon()
    3. }
    и
    Код (Text):
    1. if ( $coupons = $this->user_has_coupon() && $this->coupon_count == 1 ) {
    2.     print_r( $coupons ); // возвращает 1, хотя я ожидал, что выведет результат из $this->user_has_coupon()
    3. }
    Это баг или фича?
     
    #1 Yankovitz, 21 сен 2020
    Последнее редактирование: 21 сен 2020
  2. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    1.249
    Симпатии:
    280
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.929
    Симпатии:
    725
    булево true оно возвращает :)
    Вот что ты сделал на самом деле (выпишу в отдельную строку):
    PHP:
    1. $coupons = $this->user_has_coupon() && $this->coupon_count == 1;
    чтобы работало так, как ты ожидаешь, вот так надо сделать:
    PHP:
    1. if ( ($coupons = $this->user_has_coupon()) && ($this->coupon_count == 1) )
    А вообще, лучше присвоить переменной значение выше и уже переменную вставлять в условие.
    Так и читается лучше и голову себе не будешь ломать )

    Не очевидная хрень. А код должен быть максимальн6о очевидным, а не с минимальным количеством строк.
     
    artoodetoo нравится это.
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.310
    Симпатии:
    1.027
    Адрес:
    там-сям
    Можно или нельзя — это вопрос корпоративных стандартов. Где-то присваивание в if/while считается моветоном, а где-то такое любят. Если присваивание таки есть, надо скобками явно ограничить выражение присваивания. Иначе читабельность страдает.

    Приведу простой пример где по моим меркам присваивание нормально:
    Код (PHP):
    1. if (($p = strpos($str, '.')) !== false) {
    2.     $str = substr($str, 0, $p - 1);
    3. }
    Со скобками всё понятно. Без скобок оно неверно и надо потратить время чтобы понять что именно происходит.
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    7.718
    Симпатии:
    1.497
    @artoodetoo Вообще, в С, от которого производным является и пхп, присваивание в циклах и условиях - нормальная практика.