Else If 块和花括号

3

在PHP中,我们可以忽略条件块中花括号的使用,只需在“if”、“else if”或“else”标签后面加上一个函数/一行代码即可,如下所示:

if (myVal == "1")
  doThis();
else if (myVal == "2")
  doThat();
else
  doNothing();

我在思考这样的事情:

 if (myVal == "1")
  doThis();
else 
  if (myVal2 == true)
    doThat();
  else
    doNothing();

被PHP视为以下内容之一:
if (myVal == "1")
{ doThis(); }
else 
{
  if (myVal2 == true)
    { doThat(); }
  else 
    { doNothing(); }
}

or this :

if (myVal == "1")
  { doThis(); }
else if(myVal2 == true)
  { doThat(); }
else 
  { doNothing(); }

简短版:在一个else语句后面加上一个"line break"(换行符)是否足以将它与一个if语句分开,或者会被视为一个"else if"语句?


修改我的问题来确认我的猜测:

if(false)
  echo "1";
else 
  if (false)
    echo "2";
else
  echo "3";

以下代码出现两个else语句,导致显示“3”的同时抛出错误:

if(false)
  echo "1";
else 
  if (false)
    echo "2";
  else
    echo "4";
else
  echo "3";

所以换行似乎没有任何影响,唯一重要的是“if”和“else”的数量。


6
显而易见的问题:你试过它吗?测试起来应该很容易。然而,我觉得我应该明确表态并说,无论 PHP 是否“允许”你省略括号,在良好的编程实践中应该始终包括它们,即使在可以选择不加括号的情况下也是如此。实际上,没有任何充分的理由省略它们,而有很多理由说明这样做是一个坏主意。 - Spudley
另外,不要忘记 PHP 有一个 elseif()。如果你使用它,就可以消除任何疑问了。 - Spudley
@Spudley,确实,括号应该始终存在。我会尝试找到一个可以快速测试的情况,如果没有人在之前得到结果,我会发布结果。谢谢。 - RelevantUsername
2个回答

4
如果没有花括号,PHP 将只执行下一行作为代码块。
if (myVal == "1")
    doThis();
else 
    if (myVal2 == true)
    doThat();
    else
    doNothing();

如果myVal"1",则下一行doThis();将被选择作为要执行的代码块。如果还有更多的代码:
if (myVal == "1")
    doThis();
    doThisToo();

在这种情况下,if语句仍然只执行doThis(),而doThisToo()始终被执行。

如果myVal != "1",它会选择else条件中的第一个块,并仅执行该块。 在这种情况下,需要评估另一个if语句:

if (myVal2 == true)

这个逻辑会继续执行:通过获取下一行或由花括号包裹的下一个块来确定要执行的下一个代码块。

如果PHP只选择第一个else条件中的第一个块,假设myVal != "1"myval2 == false,那么doNothing()函数会被执行吗?谢谢。 - RelevantUsername
将 (myVal == 1) 评估为 false,跳转到下一个 else 条件。第一行是下一个块。将 (myVal2 == 2) 评估为 false,跳转到下一个 else,将第一个块标识为下一行,执行 doNothing()。 - davbryn

0

我认为你的两个示例结果完全相同

else总是属于前面的if,除非花括号另行指定。

if(包括可选的else及其后续语句作为单语句或花括号包装块)始终被视为单个语句,因此

{
    if(...) {} else {}
}

实际上是相同的

if(...) {} else {}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接