为什么条件不好的任务?

Wil*_*ald 28 php coding-style

我正在使用NetBeans for PHP 6.5.

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

if (($row = $db->get_row($sql))) {
        return $row->folder;
    } else {
        return FALSE;
    }
Run Code Online (Sandbox Code Playgroud)

Netbeans告诉我,我不应该在IF语句中使用赋值.

为什么?

Too*_*the 51

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

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

if (a = 1) { .. }
Run Code Online (Sandbox Code Playgroud)

但是你想拥有

if (a == 1) { .. }
Run Code Online (Sandbox Code Playgroud)

一些开发人员已经学会打字

if (1 == a) { .. }
Run Code Online (Sandbox Code Playgroud)

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

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

if (a = 1) { .. }
Run Code Online (Sandbox Code Playgroud)

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

  • @strager我仍然认为这是一个不好的做法,因为如果你在if子句中赋值,它实际上并没有帮助.你在一个命令中做两件事,这可能导致误解,应该避免. (4认同)
  • 我相信在if用自己的括号中包含赋值应该告诉编译器编码器知道他在做什么,并且他不应该被警告. (2认同)

Tom*_*ter 6

它可能试图帮助您避免可怕的错别字:

if(a = b)
   //logic error
Run Code Online (Sandbox Code Playgroud)

尽管我希望环境足够聪明以警告您,但也要足够聪明以达到“哦,不用担心这种情况”的条件。


rev*_*rev 5

有条件的人通常包括短路操作员。因此,给出以下示例:

if ( a=func(x) && b=func(y) )
{
  // do this
}
Run Code Online (Sandbox Code Playgroud)

可能不会立即显而易见,但是只有在第一个返回时才会发生第二个赋值>0,并且如果您func(y)有其他预期的副作用,也不会发生。

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

此外,将来的维护者可能会认为您打算执行以下操作:

if ( a==func(x) && b==func(y) ) ...
Run Code Online (Sandbox Code Playgroud)

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