在我的简单代码中,"继续"跳过条件评估并直接跳转到循环体的开头(if行),导致无限循环。我可以看到,这正是在循环断点条件下调试和恢复执行(它不会中断)或使用单步执行时发生的情况。可能只是我累了,但我一无所知。
while ( ($line = _e(fgets($dump_file))) !== FALSE )
{
if ($line === '')
{
echo 'continue';
continue;
}
您应该使用 break
关键字来停止循环。
"继续"将转到下一个循环迭代的开头,同时跳过循环的其余部分。
更多信息 :
http://php.net/manual/en/control-structures.break.php
http://php.net/manual/en/control-structures.continue.php
continue
将始终继续循环的下一次迭代。
是无限的,因为循环中$line
的值永远不会改变,所以循环要么无限执行,要么根本不执行,这取决于$line
的初始值。
break
将打破循环
> 您将_e的结果分配给 while 循环中的$line。我假设您正在从WordPress获得_e,此处记录如下:http://codex.wordpress.org/Function_Reference/_e。
返回值
(无效)
此函数不返回值。
所以,你的循环基本上是说:
while (void !== False) {
continue;
}
当然,这种情况将永远持续下去。
请注意,有几个答案指出应该使用break
语句。上面的代码旨在在点击文件末尾 (EOF) 时中止循环,fgets
返回到该文件False
。每次运行循环时,fgets
都会读取下一行,直到到达文件末尾,此时返回 False
。
从 php.net:
返回最大长度的字符串 - 从句柄指向的文件读取 1 个字节。如果文件指针中没有更多要读取的数据,则返回 FALSE。
这里的问题不在于需要 break
语句,因为当 fgets
返回 False
时,while 条件将为 false。问题是_e返回void
哪个!== False
,因此循环无限期地继续。
快速解决方案是删除 while
语句中的_e,并在必要时稍后将其应用于代码块中的字符串。
好的,所以这是发生的事情。无限循环的问题确实是由于我的_e函数没有考虑它的参数是 FALSE 值并始终返回一个字符串,因此 while 循环条件将始终按照 Ryan Vincent 和 geis 的建议计算为 TRUE。
但是,这并不能解释为什么我的调试器不会在该条件下中断。事实证明,这个问题并不相关。它自己的调试器正在执行,现在拒绝无缘无故地中断各种随机断点。
将 geis 的答案标记为所有努力的解决方案。