【问题标题】:Why does PHP not throw an error when you have a typo in the code when error reporting is set to E_STRICT为什么当错误报告设置为E_STRICT时代码中有错字时PHP不抛出错误
【发布时间】:2013-11-13 02:50:11
【问题描述】:

编辑:为了使这个问题不完全无用,我正在改变主题。

为什么 PHP 在出现 contninue 之类的错字时不会抛出错误;在错误报告设置为 E_STRICT 时的代码中。

请参阅下面的原始问题。我试图继续一个foreach循环,但不小心写了继续;而不是继续;但是在运行脚本时,我没有收到来自 NetBeans IDE 或 PHP 的警告或错误。我有 E_STRICT 和 E_ALL 错误报告,HTML 错误,显示错误等等。有没有办法让 PHP 编程更能抵御这些愚蠢的错误?请注意,没有名为 contninue 的变量或函数。事实上,我可以在一行中输入几乎任何内容,包括 dsafdsfdafdsafdsafdsafdsa_FDA9812324398s;而且不会报错。


原问题:为什么 PHP 中的 continue 不为每个循环跳到下一个循环?

发布这样的问题有点尴尬,但这里是......

这里是一个函数的一小段 sn-p 代码。我只是试图重新创建一个数组,过滤掉数组中满足特定条件的一个或多个项目,在这种情况下匹配一个 postId。 (如果您想知道,这是 Wordpress 中的开发。)

在我的简单 foreach 循环中,继续;命令似乎没有做它的工作。至少它没有表现出我对我使用过的任何其他语言(C、C#、MEL、Javascript 等)的期望。回显的输出总是包括“应该退出但它没有!”即使在继续之后;并且永远不应该被执行。此外,即使 "REMOVED" ,结果数组也始终包含过滤后的内容。 $postId 明显跑了。

$posts = get_posts( $args ); // posts is an array of objects
if($posts == null) return; // no posts
if($includeCurrentPost || $postId < 0) return $posts; // we are including all posts, so just return it

// Remove current post id from list since excluding
$newPosts = array();
$count = 0;
foreach($posts as $p) {
    if($p->ID == $postId) {
        echo("REMOVED " . $postId);
        contninue;
        echo("should have exited but it did not!");
    }
    $newPosts[$count++] = $p;
}
return $newPosts;

好的,我通常使用 C# 进行编程,并认为自己是一个不错的中级程序员。这没有任何意义。 @_@ 我猜它会变成一些愚蠢的语法错误,PHP 只是让我逃脱了我看不到的...

PHP 5.3 版本,Apache,在 Windows Vista 上运行。

【问题讨论】:

  • 错字:contninue; 也许? :) 但我想那会出现错误。
  • continue 直接跳到下一个迭代
  • 你使用什么样的 IDE 不会显示语法错误?!
  • @Smuuf 啊!!是的你是对的。我瞎了……叹息。我刚开始使用 NetBeans。我本来希望这样的事情会显示为错误,但事实并非如此,至少开箱即用。至少可以说是尴尬...
  • @Songo : Netbeans ......你有什么更好的推荐吗?我在看 Eclipse,但在我阅读的几次比较中发现 Netbeans 是首选。

标签: php wordpress foreach continue


【解决方案1】:

我刚刚在这里尝试了您的代码: http://writecodeonline.com/php/

$posts = array(1,2,3,4,5);
foreach($posts as $p) {
    if($p == 3) {
        echo("REMOVED " . $p . "\n");
        contninue;
        echo("should have exited but it did not!");
    }
    echo("Other stuff\n");
}

由于contninue而不是continue,它不起作用,但默认情况下也没有错误(这可能意味着您没有严格错误)。

当你修正错字时:

$posts = array(1,2,3,4,5);
foreach($posts as $p) {
    if($p == 3) {
        echo("REMOVED " . $p . "\n");
        continue;
        echo("should have exited and it did!");
    }
    echo("Other stuff\n");
}

有效

【讨论】:

  • 我告诉过你这将是一个错字!啊!感谢您提供有关严格错误的提示。我会设置的。顺便说一句,我正在使用 NetBeans。伙计,我想念 Visual Studio 和 C#。 :(
  • 实际上,启用 E_STRICT 和 E_ALL 错误并没有改变任何东西。日志文件中也没有显示错误。我什至可以输入 FKDSAJ_fewjafojewa 之类的内容;并且完全不会出错。
  • 也许可以在 PHP 邮件列表中询问或其他什么?或者发布一个带有设置错误级别的简短代码示例的新问题,然后只有一行 asdf; 并询问为什么没有错误?我在 php 文档中找不到任何其他内容。
【解决方案2】:

在 PHP 中,continue 结束当前迭代但不会中断循环。 break 将结束循环

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多