在php中悬空的双分号

时间:2017-12-15 16:18:00

标签: php parsing if-statement

我已经开始学习php了,我在php文档中看到了一段代码,但是在报告页面中说这不是一个bug。 代码是:

$bar = 'bar';
$foo = 'foo';

if (isset($bar)):
   if (isset($foo)) echo "Both are set.";
elseif (isset($foo)):
   echo "Only 'foo' is set.";
else:
   echo "Only 'bar' is set.";
endif;

如果我们再次将嵌套的if代码放入花括号中,则会发生错误。

if (isset($bar)) :
    if (isset($foo)) {  
           echo "Both are set.";
    }
elseif (isset($foo)) :
       echo "Only 'foo' is set.";
else :
       echo "No one is set.";
endif;

上面的代码引发意外错误":"报告页面的原因说这不是一个错误,它是上面的代码中使用的混合结构和PHP不允许,我接受了但是这使得代码出错的原因。 但是为什么如果我们在嵌套的if语句的末尾添加另一个分号就可以完美地运行。 或者为什么如果我们在嵌套if语句错误结束时添加else语句就会消失。 像这样的东西:

if (isset($bar)) :
    if (isset($foo)) {  
           echo "Both are set.";
    } else {
            echo "this is else";
    }
elseif (isset($foo)) :
       echo "Only 'foo' is set.";
else :
       echo "No one is set.";
endif;

如果有人帮助我知道这种混合结构真的很糟糕我会很感激但是理解这个问题将有助于防止出现其他错误。 非常感谢;

1 个答案:

答案 0 :(得分:0)

问题在于:

if (cond):
    if (cond) stuff();
elseif (cond):
    stuff();
else:
    stuff();
endif;

实际上是dangling-else问题的一个实例 - elseif是否属于"内部"或者"外部" if用空格不敏感的语言?

PHP chooses to parse就像这样: 1

if (cond):
    if (cond)
        stuff();
    elseif (cond):
        stuff();
    else:
        stuff();
    endif;

混合了两种语法,即" not supported"。

所以有人可能会倾向于说这是一个错误(这不是相关bug report的结论) - 规范声明:

  

else子句与语法允许的词法最近的前ifelseif相关联。

假设这也适用于elseif子句,那么可以说解析器应该将我们的elseif与我们的外部if相关联,因为其他任何内容都不允许。

任何导致上述解析无法实现的问题都可以解决问题。从该错误报告中获取最简单的示例:

if (cond):
    if (cond) stuff();
    ;                   // <<<<
elseif (cond):
    stuff();
else:
    stuff();
endif;

额外的分号表示elseif不能被解释为内部if / elseif / if链的一部分。

<子> 1。在这个特定的代码段中,我假装空格非常重要。