9

我最近开始使用 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,而 $a 又将 1 返回给 while 语句,而不是针对 $a 进行测试并在 $a 不为 1 时返回 false 给 while 语句。

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

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

出锅,入火。

4

8 回答 8

30
while (($row = $sql->db_Fetch("MYSQL_ASSOC")) != false)
于 2010-04-05T04:53:05.417 回答
8

因此,您不必在没有正当理由的情况下重写所有代码:您可以在Window |中禁用对这种潜在编程错误的检测。首选项,PHP | 语义分析

于 2010-12-10T09:49:26.473 回答
6

这可能被标记为警告,因为人们在表示“==”时经常会错误地使用“=”。

例如:

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

这永远不会终止,但如果你认为你已经写了“==”,它应该会。

于 2009-03-10T13:04:22.063 回答
2

Zend Studio 正试图帮助您编写更容易调试的更好的代码。禁用语义检查不是一个好主意,它只会将潜在的问题扫到地毯下,而您将错过真正的问题。这是一个正当的理由!不要通过忽略它们来避免警告消息,通过实施正确的解决方案来修改您的代码。

于 2011-02-24T12:59:02.617 回答
2

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

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

这是因为即使“getName”返回一个空值,它也会被分配给“s”,并且对象和布尔值(这是条件语句所需的类型)之间的转换与 PHP 一样有点主观,因此它会抛出一个编译时异常。

PHP 中的情况可能有所不同,但出于某种原因,Zend 开发人员决定默认保持此警告处于活动状态,您可以如前所述禁用它,但我认为它会在发生真正的条件分配时为您提供帮助。

只需分配结果然后像这样比较它,清除警告就很容易了:

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

代替:

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

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

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

于 2011-08-11T23:57:38.643 回答
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);
}

这应该可以解决问题,并且“条件分配”消息应该消失。

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

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

并不是

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

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

于 2010-09-28T08:59:05.537 回答
0

它不好的原因是很多人在表示“==”时使用“=”

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

于 2009-03-10T13:13:39.733 回答
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 手册并建议他们更改示例以使用更好的样式。也许你们中的一些人可以这样做,我们可以改进文档?!

于 2010-09-30T18:36:28.670 回答