gpt4 book ai didi

php - 在 php 中悬空的双分号

转载 作者:行者123 更新时间:2023-12-04 17:47:20 25 4
gpt4 key购买 nike

我已经开始学习 php,我在 php 文档中看到了一段代码,该代码被报告为错误,但在报告页面中说那不是错误。代码是:

$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;

如果有人帮助我知道这种混合结构确实很糟糕,我将不胜感激,但了解问题将有助于防止再次犯错。非常感谢;

最佳答案

问题在于:

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 的结论)- 规范指出:

An else clause is associated with the lexically nearest preceding if or elseif that is permitted by the syntax.

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


任何导致上述解析不可能的事情都会缓解这个问题。以该错误报告中最简单的例子为例:

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

额外的分号意味着 elseif 不能被解释为内部 if/elseif/if< 的一部分 链。


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

关于php - 在 php 中悬空的双分号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47836171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com