PHP中是否存在BUG" IF块"解析方法还是什么?

时间:2017-08-30 03:00:06

标签: php if-statement parsing-error

考虑以下假设的PHP示例:

jpa

忽视哑巴逻辑并专注于$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; 行。如果你自己尝试,你会得到一个 PHP EXCEPTION 错误,说" 语法错误,意外':' "

现在,您可能认为修复方法是将elseif括在if之间,而不是单行语句,如下所示:

{ }

错误!错误仍然存​​在。与之前完全相同的 EXCEPTION ......

那么,这些例子有什么问题?

1 个答案:

答案 0 :(得分:1)

嗯,这就是我发现的:如果你在{{1}之前放置一个分号(; AFTER 大括号(}) }语句,然后错误消失了!试试吧:

elseif

很奇怪,如果你回到第一个例子并在$foo = 'foo'; $bar = 'bar'; 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; 语句之前立即加分号,它也会起作用:

elseif

但是,它并没有结束。你也可以这样做:

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

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;

然而,在最后一个例子中,逻辑变得完全混乱! $foo = 'foo'; $bar = 'bar'; 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; 现在将属于子elseif而不是第一个if,其余逻辑将全部表现为"单个语句"仅响应第一个if。很容易混淆和容易出错(小心)。

差异非常微妙,可能会欺骗眼睛(特别是在调试时)。出于这个原因,我强烈建议从这个答案的第一个例子:当使用IF-ELSEIF块(AKA"替代语法")时,如果其中需要另一个IF,请将其括在if之间并且不要忘记在最后{}之后添加分号。例如:

}

也许事实是有人搞砸了那些PHP Block Alternative Statements的语言解析过程,或者没有记录这个非常重要的细节!