为什么替代语法开关语句中的输出会导致语法错误


Why does output in an alternate-syntax switch statement cause a syntax error

>我最近遇到了 switch 语句语法错误,http://php.net/manual/en/control-structures.alternative-syntax.php

我的IDE(phpstorm)检测到错误,但它没有提供任何有用的上下文进行更正。 当将文件作为模板包含时,代码确实产生了致命错误。

手册页的警告:


警告 switch 语句和第一种情况之间的任何输出(包括空格)都将导致语法错误。例如,这是无效的:

<?php switch ($foo): ?>
    <?php case 1: ?>
    ...
<?php endswitch ?>

而这是有效的,因为 switch 语句后面的尾随换行符被认为是结束 ?> 的一部分,因此在开关和大小写之间没有任何输出:

<?php switch ($foo): ?>
<?php case 1: ?>
    ...
<?php endswitch ?>

手册页没有提供任何解释。 页面上的一些用户评论也没有解释任何事情;他们只是重申不允许使用空格。

为什么这是语法错误?

就是这样。

这是一个语法错误,原因与此相同:

<?php
$foo = 1;
switch ($foo) {
?>
    This can't be here.
    <?php
    case 1:
        echo "I'm one";
        break;
    case 2:
        echo "I'm two";
        break;
}

这导致:

[2016 年 1 月 27 日 22:21:08 欧洲/柏林] PHP 解析错误:语法错误,意外的"这不能在这里",在第 7 行的/path/file 中需要大小写 (T_CASE) 或默认值 (T_DEFAULT) 或"}"

唯一可以跟随switch的是 case .这就是语言的工作方式。

替代语法

的特定于空格的限制是它是替代语法的原因之一:它会导致丑陋的格式,并且在人们通常期望看到的地方缺少缩进。