用于生成语法错误的控制结构的混合语法


Mixed syntax for control structures generating syntax errors

我正在重构一些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;

有人能向我解释一下为什么第一块代码会产生错误吗?

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

问题是第二个else。解析器看不出这个else是属于第一个if还是第二个if(从一开始计数)。在第二个示例中,有一个endif使第二个if-块终止,以便它可以在那里进行解析。也许这就是著名的伪装的"悬挂他人"问题?

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

如果在最后一个大括号后面放一个分号,效果很好:

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

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

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

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

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