1

考虑以下假设的 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;

考虑愚蠢的逻辑并专注于elseif行。如果你自己尝试,你会得到一个PHP EXCEPTION错误,说“语法错误,意外':'

现在,您可能认为解决方法是将 sub-if括在中间{ }而不是单行语句,如下所示:

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

错误的!错误仍然存​​在。与以前完全相同的例外...

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

4

1 回答 1

1

好吧,这就是我发现的:如果你在语句之前的大括号 ( ;)之后放置一个分号 () ,那么错误就消失了!试试看:}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;

然而,在最后一个例子中,逻辑被完全打乱了!现在elseifwill 属于 sub-if而不是 first if,其余的逻辑都将表现为“一个单一的语句”,仅响应第一个if。非常混乱和容易出错(小心)。

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

if (isset($bar)):
   if (isset($foo)) {
     echo "Both are set.";
   };
elseif (...):

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

于 2017-08-30T03:00:06.270 回答