2008-10-07 22 views
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; 

可能有人请向我解释为什么第一个代码块产生的错误?

回答

2

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

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

+0

这听起来像是一般问题,它看起来像解释器只是被其他人困惑,但它确实不应该是因为它仍然很短1} – UnkwnTech 2008-10-07 22:00:10

2

我不知道确切的原因。这里有一个相关的PHP bug post,其中一个开发者基本上说“只是不要这样做”:)。最近我还没有通过PHP源代码,但如果我不得不冒险猜测,这是由于在递归审阅if语句时没有检查替代语法。

0

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

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

+0

上面的代码只是一个例子。而且,我同意 - 可读代码使生活变得更容易。然而,关于使用花括号我不同意 - 恕我直言,当控制结构以描述性语句结尾时,代码更易读,如endif,endfor等,这些都必须使用: – Bill 2008-10-08 02:00:13

1

如果你把一个分号最后一个大括号后,它工作正常:

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

缩进被定罪,它解释第一个例子为一个,如果使用与其他匹配了括号使用替代语法。

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