почему присвоения в условиях плохой?

Я использую NetBeans для PHP 6.5.

В моем коде я часто использую следующий тип команды:

if (($row = $db->get_row($sql))) { return $row->folder; } else { return FALSE; } 

Netbeans говорит мне, что я не должен использовать назначения в инструкции IF.

Зачем ?

Solutions Collecting From Web of "почему присвоения в условиях плохой?"

Они неплохие, но они могут привести к опасным ошибкам.

В c-подобных языках, где присваивание является выражением (для поддержки, например, a = b = c = 1;), общая ошибка:

 if (a = 1) { .. } 

Но вы хотели иметь

 if (a == 1) { .. } 

Некоторые разработчики научились печатать

 if (1 == a) { .. } 

Чтобы создать ошибку, если один '=' забыт. Но я думаю, что это не улучшает читаемость.

Однако современные компиляторы дают предупреждение, если вы пишете

 if (a = 1) { .. } 

который я считаю лучшим решением. В этом случае вы должны проверить, действительно ли это было на самом деле.

Вероятно, это поможет вам избежать страшной опечатки:

 if(a = b) //logic error 

Хотя я ожидал бы, что окружающая среда достаточно умна, чтобы предупредить вас об этом, а также быть достаточно умным, чтобы условия «о, не волнуйтесь об этом случае».

Условные часто включают операторы короткого замыкания. Итак, учитывая этот пример:

 if ( a=func(x) && b=func(y) ) { // do this } 

Это может быть не сразу очевидным, но второе назначение произойдет только в том случае, если первое возвращено >0 , и если func(y) имеет другие побочные эффекты, которые вы ожидали, они тоже не произойдут.

Короче говоря, если вы знаете, что делаете и понимаете побочные эффекты, то в этом нет ничего плохого. Тем не менее, вы должны учитывать возможность того, что кто-то другой может поддерживать ваш код, когда вы ушли, и они могут быть не такими опытными, как вы.

Кроме того, будущие сопровождающие могут подумать, что вы планируете следующее:

 if ( a==func(x) && b==func(y) ) ... 

Если они «исправляют» ваш код, они фактически нарушают его.

В языках, которые всегда возвращают значение при назначении, это неплохо (я думаю, что это довольно часто встречается в функциональных языках), но (как уже говорили другие, когда я набирал это), его обычно следует избегать, так как вы или кто-то другой может ошибочно принять его за сравнение. Компилятор должен обычно предупреждать об этом, но его можно игнорировать, если вы уверены, что делаете …

как бы выглядел код, если вы не назначили значение $ row в условии цикла, это было бы намного сложнее, я думаю … хотя это не так хорошо читать для некоторых сопровождающих, нет? хорошо, вы можете сделать это, как

 $next = mysql_fetch_assoc($result) do{ ... ... ... $next = mysql_fetch_assoc($result) or break; }while ($next) 

Я использую их все время, с петлями (не уверен, почему это изменило бы), например:

 $counter = 0; while( $getWhateverDataObj = mysql_fetch_object( $sqlResult )) { $getWhateverObj->firstName[$counter] = $getWhateverDataObj->firstName; $getWhateverObj->lastName[$counter] = $getWhateverDataObj->lastName; $counter++; } 

И он отлично работает.