PHP 继续跳过条件评估


php continue skips the condition evaluation

在我的简单代码中,"继续"跳过条件评估并直接跳转到循环体的开头(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 的答案标记为所有努力的解决方案。