PHP Heredoc对大括号的具体处理规则是什么?为何出现解析差异?
PHP Heredoc 大括号解析问题解答
核心规则先明确
Heredoc 的变量解析逻辑和普通双引号字符串完全一致,支持两种变量插入语法:
- 简单语法:直接书写
$变量名即可,PHP 会自动识别最长的合法变量名完成解析,适合没有后续特殊字符的简单变量场景 - 复杂花括号语法:必须以
{$(左大括号紧接美元符)开头,用大括号包裹完整的变量/表达式内容,这种语法会明确告知 PHP 大括号内的内容都属于变量部分,避免解析歧义
你遇到的解析差异原因
你观察到只有 src 部分的大括号没有被去除、变量值却被正常解析的情况,说明 PHP 没有把这对大括号识别为复杂语法的标记,而是当成了普通文本处理,同时单独解析了中间的$achievement_id变量。常见触发原因有两个:
- 不可见字符干扰:
{和$之间存在肉眼看不到的空白字符(比如零宽空格、全角空格),破坏了{$的连续结构,你可以把整段{$achievement_id}删掉手动重写一遍,基本就能解决 - Heredoc 结束标记缩进异常:PHP 7.3 之前要求 Heredoc 的结束标记必须完全顶格书写,前面不能有任何缩进、空格;即使是 7.3+ 版本支持缩进结束标记,也要求结束标记的缩进量和正文最小缩进量完全一致。从你贴的代码看结束的
TEXT前面有明显缩进,如果你的 PHP 版本低于7.3,直接把结束标记顶格即可解决问题
另外你提到直接写$achievement_id就能正常输出,是因为这种简单语法不需要匹配大括号结构,没有上述规则限制,所以解析正常。
内容的提问来源于stack exchange,提问作者spedigod
相关产品推荐
相关产品推荐

