почему задания в условиях плохие? - PullRequest
27 голосов
/ 25 ноября 2008

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

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

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

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

Почему?

Ответы [ 6 ]

50 голосов
/ 25 ноября 2008

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

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

if (a = 1) { .. }

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

if (a == 1) { .. }

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

if (1 == a) { .. }

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

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

if (a = 1) { .. }

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

4 голосов
/ 25 ноября 2008

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

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

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

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

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

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

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

4 голосов
/ 25 ноября 2008

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

if(a = b)
   //logic error

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

2 голосов
/ 25 ноября 2008

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

1 голос
/ 10 июля 2009

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

$next = mysql_fetch_assoc($result)
do{
...
...
...

$next = mysql_fetch_assoc($result) or break;
}while ($next)
0 голосов
/ 25 ноября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...