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

时间:2008-10-07 21:07:41

标签: php syntax

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

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

5 个答案:

答案 0 :(得分:2)

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

问题是第二个else。解析器无法查看此else是属于第一个还是第二个if(从头开始计算)。在第二个示例中,有一个endif使第二个if - 块被终止,因此它可以进行解析。也许这就是伪装中着名的“悬挂其他”问题?

答案 1 :(得分:2)

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

答案 2 :(得分:1)

如果你在最后一个大括号之后加上一个分号,它可以正常工作:

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

答案 3 :(得分:1)

缩进被诅咒,它将第一个例子解释为使用替代语法使用与其他句法匹配的大括号。

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

答案 4 :(得分:0)

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

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