switch语句中PHP起始标签前的空格为何引发语法错误?
为什么PHP中switch的case行前的空格会触发语法错误?
先看这段有问题的代码:
$var = 1; switch ($var): ?> <?php case 1:?> // BUGGY LINE <?php echo 1; break; case 2: echo 2; break; endswitch; ?>
运行这段代码时会触发如下语法错误:
( ! ) Parse error: syntax error, unexpected ' ', expecting endswitch (T_ENDSWITCH) or case (T_CASE) or default (T_DEFAULT)
其实这事儿得从PHP的混合模式解析规则说起。当你用switch ($var):这种替代语法(不用大括号,而是冒号搭配endswitch收尾)的时候,PHP对这个代码块的结构要求特别严格。
你看那个出问题的行:?> <?php case 1:?>,中间的空格会被PHP当成要输出的内容处理——说白了,这个空格不属于switch结构里的代码,而是独立的输出文本。但在冒号形式的switch块里,从switch ($var):到endswitch;的整个范围内,只能有case、default以及对应的业务逻辑,半点儿额外的输出内容(哪怕就是这么一个不起眼的空格)都插不进去。
当PHP撞见这个空格时,它会直接认为:“哦,switch块已经结束了”,结果后面的case 1:就成了没爹没妈的孤立语句,自然就抛出了“我等着endswitch、case或者default呢,你给我整个空格算啥”的语法错误。而把空格删掉后,?>和<?php直接连在一起,中间没有任何输出内容,PHP就会把前后的代码当成同一个switch结构的一部分来解析,问题自然就解决了。
说白了就是:冒号版的switch是个认死理的严格块级结构,case/default之前绝对不能插额外输出;而大括号版的switch就宽松多了,不会因为这点儿空格闹脾气。
内容的提问来源于stack exchange,提问作者4unkur
相关产品推荐
相关产品推荐

