我最近开始使用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将不会发出警告!
因此,通过删除有关常见错误的警告,我正在为自己设置一个不同的常见错误。
走出锅,进入火中。
答案 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手册并建议他们更改示例以使用更好的样式。也许你们中的一些人也可以这样做,我们可以改进文档?!