0

我正在重构一些 PHP 代码,发现某些嵌套组合

if () :

if () {

产生语法错误。并不是说我通常会将两者混合使用,但我喜欢在编写代码时经常进行语法检查,因此我不断收到语法错误。

示例 - 生成语法错误:

if ( $test == 1 ) :
  if ( $test2 == 'a' ) {
    if ( $test3 == 'A' ) {
    } else {
    }
  }
else :
  echo 'test2';
endif;

示例 - 不会产生语法错误:

if ( $test == 1 ) :
  if ( $test2 == 'a' ) :
    if ( $test3 == 'A' ) :
    else :
    endif;
  endif;
else :
  echo 'test2';
endif;

有人可以向我解释为什么第一段代码会产生错误吗?

4

5 回答 5

2

这是一个疯狂的猜测,因为我不熟悉 PHP 的语法。但这里有:

问题是第二个else。解析器无法查看这else是属于第一个还是第二个 if(从头开始计数)。在您的第二个示例中,有一个endif使第二个if-block 被终止,因此它可以在那里进行解析。也许这就是著名的“悬空-else”问题的变相?

于 2008-10-07T21:25:41.227 回答
2

我不知道确切的原因。这是一个相关的PHP 错误帖子,其中开发人员基本上说,“不要这样做”:)。我最近没有仔细阅读 PHP 源代码,但如果我不得不冒险猜测,那是因为在递归执行 if 语句时没有检查替代语法。

于 2008-10-07T21:38:30.717 回答
1

如果你在最后一个花括号后加一个分号,它工作正常:

if ( $test == 1 ) :
  if ( $test2 == 'a' ) {
    if ( $test3 == 'A' ) {
    } else {
    }
  };
else :
  echo 'test2';
endif;
于 2008-10-08T00:54:04.800 回答
1

该死的缩进,它将第一个示例解释为使用大括号的 if 与使用备用语法的 else 匹配。

一致性是这里的经验法则,无论如何解释对任何读者来说都是模棱两可的,所以要么按照其他答案中的建议放入分号,或者更好......清理代码。那太糟了!

于 2008-10-08T03:38:57.183 回答
0

我在这里唯一能说的是代码完全不可读。避免:像瘟疫一样。使用熟悉的 C 风格花括号语法。

代码的质量很大程度上取决于它的可读性,所以一定要努力清理它,你会为自己省去一堆令人惊讶的错误。

于 2008-10-08T00:30:49.277 回答