if {} in if:endif

时间:2012-03-29 20:12:23

标签: php

为什么它不起作用?出现解析错误:语法错误,第7行意外':'...

$a = 0; $b = 1; $c = 3; $d = 4;
if ($a == $b):
   if ($b == $c) {
       // something
   }
else:
   $c = $a;
endif;

但如果我将其更改为(只是添加了其他声明):

$a = 0; $b = 1; $c = 3; $d = 4;
if ($a == $b):
   if ($b == $c) {
       // something
   } else {
       // something
   }
else:
   $c = $a;
endif;

工作正常。

为什么?这不是PHP的错误吗?或者有一个关于if ...的规则我应该知道吗?

无论如何,我使用的是PHP 5.3.3版本。

4 个答案:

答案 0 :(得分:15)

我不确定我是否会称这是一个错误,但我认为你因为dangling else和你的混合if-else语法而遇到了这个问题:

if ($a == $b):            // 1
    if ($b == $c) {       // 2 
        // something      // 3
    }                     // 4
else:                     // 5 - this else
    $c = $a;              // 6
endif;                    // 7

注意第5行的else是如何模糊的:它可以“属于”第一个或第二个if语句。

您可以通过在嵌套if之后添加分号来轻松消除这种歧义并修复语法错误:

if ($a == $b):            // 1
    if ($b == $c) {       // 2 
        // something      // 3
    };                    // 4 - here
else:                     // 5 
    $c = $a;              // 6
endif;                    // 7

另外请注意,请不要使用此语法,除非您希望其他程序员在睡眠中将您打死。

答案 1 :(得分:1)

正如PHP manual's control structure page的评论中所述,解析器似乎并不总是假设一个样式中的if不能与使用另一个样式的else匹配。

答案 2 :(得分:0)

在处理嵌套ifs时,if / else的冒号形式可能不明确。在你的例子中,else附加了第二个if(因为它应该。)为了避免这种情况,你必须明确地让解释器知道其他与第一个if配对,或者通过向第二个if添加else(正如您在第二个代码块中所示,或使用{}明确定义控制流。

换句话说,您可以使用多种形式的if语句。例如:

if (foo):
  //statements
else {
  //statements
}

完全有效。虽然我建议不要混合表格,因为它会影响可读性。

答案 3 :(得分:0)

按PSD标准,始终使用括号。

$a = 0;
$b = 1;
$c = 3;
$d = 4;
if ($a == $b) {
    if ($b == $c) {
        // something
    } else {
        $c = $a;
    }
}

它更易读,更安全,更清晰。