Zend Studio报告警告:条件分配。这真糟糕吗?

时间:2009-03-10 12:59:45

标签: zend-framework warnings while-loop variable-assignment conditional-statements

我最近开始使用Zend Studio报告了以下类型的代码:

$q = query("select * from some_table where some_condition");
while ($f = fetch($q)) {
  // some inner workings
}

要停止警告,代码需要像这样写:

$q = query("select * from some_table where some_condition");
$f = fetch($q);
while ($f) {
  // some inner workings
  $f = fetch($q);
}

为什么这会被标记为警告?它太糟糕了吗?

我知道警告可能会被设计为阻止这样的错误:

$a = 1;
while ($a = 1) {
  // some inner workings
  $a++;
}

永远不会终止因为1被分配给$ a而后者又向while语句返回1,而不是针对$ a进行测试,并且当$ a不是1时将false返回到while语句。

很容易出错,可以验证警告,但是在第二个例子中忘记在while块的末尾添加额外的$ f = fetch($ q),这也会导致循环永远不会终止。如果我更改我的代码以删除警告,然后忘记在while块的末尾添加$ f = fetch($ q),Zend将不会发出警告!

因此,通过删除有关常见错误的警告,我正在为自己设置一个不同的常见错误。

走出锅,进入火中。

8 个答案:

答案 0 :(得分:30)

while (($row = $sql->db_Fetch("MYSQL_ASSOC")) != false)

答案 1 :(得分:8)

因此,如果没有正当理由,您将无需重写所有代码: 您可以在 Window |中禁用对此潜在编程错误的检测首选项,PHP |语义分析

答案 2 :(得分:6)

这可能被标记为警告,因为人们经常在他们的意思是“==”时错误地使用“=”。

例如:

$a = 1
while($a = 1) {
   $a++;
}

这永远不会终止,但如果你认为你写的是“==”,那就应该。

答案 3 :(得分:2)

Zend Studio正在努力帮助您编写更好的代码,以便更轻松地进行调试。禁用语义检查不是一个好主意,它只是扫描地毯下的潜在问题,你会错过真正的问题。这是一个不错的理由!不要忽略警告消息,通过实施正确的解决方案来修改代码。

答案 4 :(得分:2)

众所周知,Zend Studio是基于eclipse构建的,它是一个Java IDE。在Java语言中,做这样的事情是非法的:

String s;
while (s = getName()) {
    ...
}

那是因为即使'getName'返回一个空值,它也将被赋值为's'并且在对象和布尔值之间进行转换(这是条件语句所需的类型)与PHP相比更加主观,因此它将在编译时抛出异常。

PHP中的情况可能有所不同,但由于某些原因,Zend开发人员决定默认激活此警告,您可以如前所述禁用它,但我认为它会在条件发生时实际分配时帮助您。 / p>

只需分配结果然后比较它就可以轻松清除警告:

if (($result = $mysqli->query ( $query )) == true) {

而不是:

if ($result = $mysqli->query ( $query )) {

如您所见,您不需要额外的代码串。

无论如何,这只是一个警告,你不必担心它们。

答案 5 :(得分:1)

实际上,我猜你的问题已经得到了解答。但是为了解决你的实际问题,我认为这可能有所帮助。

//i dont know what is returned if there are no more records to fetch...
//but lets assume it is a boolean value
while (($f = fetch($q))!= false)
{
    $this->doSomethingVeryImportantThatMakesYourBossHappy($f);
}

应该这样做,“条件分配” - 消息应该消失。

作为旁注:使用equals运算符的方式与否定东西的方式相同。您还可以将等号与其他运算符一起使用,例如

if ($falseness != false){$trueness = true}

而不是

if ($falseness ! false){$trueness = false}

这有助于我始终记住如何比较值而不是为它们赋值。

答案 6 :(得分:0)

很糟糕的原因是很多人使用“=”表示“==”

=运算符会将分配返回到左侧,因此如果使用if($x=true),则运行if中的代码,如果使用if($x=false),则代码将不会运行。这是一个巧妙的技巧,可以保存一两行代码,但它也很危险,因为如果你的意思是if($x == false)并键入if($x = false),那么这将是一个难以追踪的错误。

答案 7 :(得分:0)

不,我的朋友条件中的所有分配都会生成此警告。我不想完全关闭它,因为=而不是==是我容易出现的语法错误。 至于为什么有必要的问题,我将使用PHP手册中的一个例子。这是关于“MySQL改进”扩展或mysqli:

的部分
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
        printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
    }

不幸的是,我使用这种技术开发了我的数据库函数,并尝试在Zend Studio中使用它们。这个错误弹出足够多次是一个真正的痛苦。我将在这里重新提出建议,因为我重视明确的代码,但是我也会跳到PHP手册并建议他们更改示例以使用更好的样式。也许你们中的一些人也可以这样做,我们可以改进文档?!