考虑以下假设的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 ......
那么,这些例子有什么问题?
答案 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的语言解析过程,或者没有记录这个非常重要的细节!