我正在重构一些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风格大括号语法。
代码的质量在很大程度上取决于它的可读性,所以一定要努力清理它,你会省去一堆令人惊讶的错误。