Привет, есть 2 похожих условия: Код (Text): if ( $this->coupon_count == 1 && $coupons = $this->user_has_coupon() ) { print_r( $coupons ); // возвращает результат из $this->user_has_coupon() } и Код (Text): if ( $coupons = $this->user_has_coupon() && $this->coupon_count == 1 ) { print_r( $coupons ); // возвращает 1, хотя я ожидал, что выведет результат из $this->user_has_coupon() } Это баг или фича?
булево true оно возвращает Вот что ты сделал на самом деле (выпишу в отдельную строку): PHP: $coupons = $this->user_has_coupon() && $this->coupon_count == 1; чтобы работало так, как ты ожидаешь, вот так надо сделать: PHP: if ( ($coupons = $this->user_has_coupon()) && ($this->coupon_count == 1) ) А вообще, лучше присвоить переменной значение выше и уже переменную вставлять в условие. Так и читается лучше и голову себе не будешь ломать ) Не очевидная хрень. А код должен быть максимальн6о очевидным, а не с минимальным количеством строк.
Можно или нельзя — это вопрос корпоративных стандартов. Где-то присваивание в if/while считается моветоном, а где-то такое любят. Если присваивание таки есть, надо скобками явно ограничить выражение присваивания. Иначе читабельность страдает. Приведу простой пример где по моим меркам присваивание нормально: Код (PHP): if (($p = strpos($str, '.')) !== false) { $str = substr($str, 0, $p - 1); } Со скобками всё понятно. Без скобок оно неверно и надо потратить время чтобы понять что именно происходит.
@artoodetoo Вообще, в С, от которого производным является и пхп, присваивание в циклах и условиях - нормальная практика.