我正在使用NetBeans for PHP 6.5。
在我的代码中,我经常使用以下类型的命令:
if (($row = $db->get_row($sql))) {
return $row->folder;
} else {
return FALSE;
}
Netbeans告诉我,我不应该在IF声明中使用作业。
为什么?
答案 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++;
}
它运作正常。