为什么条件不好的任务?

时间:2008-11-25 13:07:07

标签: php coding-style

我正在使用NetBeans for PHP 6.5。

在我的代码中,我经常使用以下类型的命令:

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

Netbeans告诉我,我不应该在IF声明中使用作业。

为什么?

6 个答案:

答案 0 :(得分:50)

它们并不坏,但它们可能导致危险的错误。

在类似语言中,赋值是表达式,(支持例如a = b = c = 1;)常见错误是:

if (a = 1) { .. }

但你想拥有

if (a == 1) { .. }

一些开发人员已学会输入

if (1 == a) { .. }

如果忘记了'=',则创建错误。但我认为它并没有提高可读性。

但是现代编译器,如果你写的话会发出警告

if (a = 1) { .. }

我认为这是一个更好的解决方案。在这种情况下,你被迫检查它是否真的是你的意思。

答案 1 :(得分:4)

它可能试图帮助您避免可怕的拼写错误:

if(a = b)
   //logic error

虽然我希望环境足够聪明,可以警告你,还要聪明到能够“哦,不要担心这种情况”的条件。

答案 2 :(得分:4)

条件通常包括短路操作员。所以,举个例子:

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

它可能不会立即显而易见,但第二次分配只会在第一次返回>0时发生,如果func(y)有其他副作用,那么它们也不会发生。< / p>

简而言之,如果您知道自己在做什么并了解副作用,那么它就没有任何问题。但是,您必须考虑其他人在您离开时可能维护您的代码的可能性,并且他们可能没有您那么有经验。

此外,未来的维护者可能会认为您打算如下:

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

如果他们“修复”你的代码,他们实际上会破坏它。

答案 3 :(得分:2)

在总是在作业中返回值的语言中,它不是(我认为它在函数式语言中很常见),但是(正如其他人在我输入的时候已经说过的那样)通常应该避免因为你或其他人可能会将其误认为是比较。编译器通常应该警告它,但如果你确定你在做什么就可以忽略它......

答案 4 :(得分:1)

如果不在循环条件中分配$ row值,代码将如何显示 我觉得这会复杂得多...... 虽然对于一些维护者来说没有那么好读,不是吗? 你可以像

那样做
$next = mysql_fetch_assoc($result)
do{
...
...
...

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

答案 5 :(得分:-1)

我一直使用它们,带有循环(不确定为什么会产生影响),例如:

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

它运作正常。