我正在重构一些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;
有人可以向我解释为什么第一个代码块会产生错误吗?
答案 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风格大括号语法。
代码的质量很大程度上取决于它的可读性,所以要努力清理它,你会省去一堆令人惊讶的错误。