【问题标题】:php switch statement alternative syntax parse error when extra new line [duplicate]额外换行时的php switch语句替代语法解析错误[重复]
【发布时间】:2014-05-11 21:27:36
【问题描述】:

按预期工作,没有解析错误

<?php switch(rand(0,2)): ?>
<?php case 0: ?>
<?php break;?>

<?php case 1: ?>
<?php break;?>

<?php case 2: ?>
<?php break;?>

<?php endswitch;?>
</div>

由于切换后的新行而产生 parese 错误...这是非常奇怪的行为。使用 PHP 5.4.24。

解析错误:解析错误,预计第 18 行 /Library/WebServer/Documents/phppos/index.php 中的 "endswitch (T_ENDSWITCH)"' or"case (T_CASE)"' 或 `"default (T_DEFAULT)"'

<?php switch(rand(0,2)): ?>

<?php case 0: ?>
<?php break;?>

<?php case 1: ?>
<?php break;?>

<?php case 2: ?>
<?php break;?>

<?php endswitch;?>

【问题讨论】:

  • 试过&lt;?php switch(rand(0,2)) { ?&gt; something ... &lt;?php }?&gt; ?
  • 嗯,这有点酷。在 hhvm 中尝试并得到一个类似但更详细的错误: $ hhvm test.php 致命错误:语法错误,意外的 T_INLINE_HTML,在 /home/jkoudys/test.php 的第 2 行 #0 处需要 T_ENDSWITCH 或 T_CASE 或 T_DEFAULT /home/jkoudys/test.php:2]

标签: php


【解决方案1】:

&lt;?php...?&gt; 之外的所有内容 - 包括空格 - 都会像使用 echo 一样输出,所以:

?>

<?php 

等价于:

 echo '
 ';

由于这样的回显在那个位置是无效的——在开关中,但在任何情况下或默认块中都不是——因此通过以这种方式关闭 PHP 块来暗示它是无效的。

解决方案就是不要用 ?> 关闭 PHP 块,除非您真正希望输出发生。

【讨论】:

  • 来自文档:switch语句逐行执行(实际上是逐语句执行)。一开始没有执行任何代码。 所以yes echo会报错。
【解决方案2】:

这个带有内联 PHP 的模板代码 100% 没有意义,除非你没有向我们展示完整的代码:

<?php switch(rand(0,2)): ?>

<?php case 0: ?>
<?php break;?>

<?php case 1: ?>
<?php break;?>

<?php case 2: ?>
<?php break;?>

<?php endswitch;?>

为什么不这样做并在末尾添加default: 以捕获您可能找不到的案例:

switch(rand(0,2)) {
  case 0:
    break;
  case 1:
    break;
  case 2:
    break;
  default:
}

【讨论】:

  • 为什么我需要一个默认值 rand(0,2)?
  • @ChrisMuench 正确。但是您的代码 100% 毫无意义,并且似乎由于语法而失败。所以我想我会清理它并添加它。
  • 我把代码当作一个简化的测试用例来缩小问题范围,避免不相关的细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多