Я использую NetBeans для PHP 6.5.
В моем коде я часто использую следующий тип команды:
if (($row = $db->get_row($sql))) { return $row->folder; } else { return FALSE; }
Netbeans говорит мне, что я не должен использовать назначения в инструкции IF.
Зачем ?
Они неплохие, но они могут привести к опасным ошибкам.
В 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++; }
И он отлично работает.