PHP 8 中多行字符串主要用 heredoc 和 nowdoc:heredoc 支持变量解析与转义,以 <<<标识符 开始、顶格标识符结束;nowdoc 不解析变量,类似单引号。

PHP 8 中定义多行字符串,主要用 heredoc 和 nowdoc 两种语法,它们比拼接换行符或用双引号包裹 \n 更清晰、更安全,尤其适合 HTML 模板、SQL 片段或长文本。
heredoc:支持变量解析的多行字符串
heredoc 类似双引号,能自动展开变量和转义序列(如 \n、\t),但不需要对引号转义。写法是 <<<标识符 开头,同一行顶格写 标识符; 结束:
- 标识符必须由字母、数字或下划线组成,不能含空格或特殊字符
- 结束标识符前不能有任何空白字符(包括空格、制表符、不可见 Unicode 字符)
- 结束标识符后建议另起一行,且该行仅含标识符+分号,前后留空行更稳妥
示例:
$name = "张三";
$html = <<<HTML
<div class="user">
<h2>欢迎,{$name}!</h2>
<p>您已登录。</p>
</div>
HTML;
echo $html;
nowdoc:不解析变量的“原样”多行字符串
nowdoc 类似单引号,所有内容原样保留,变量名、$、{ }、\n 都不会被解释,适合写正则模板、配置片段或需要严格字面量的场景。写法是在 heredoc 的起始标识符外加单引号:
立即学习“PHP免费学习笔记(深入)”;
- 起始写成
<<<'IDENTIFIER' - 结束标识符也必须顶格、无空格,且不带引号
- 中间所有字符(包括缩进、空行、$ 符号)都按字面输出
示例:
$pattern = <<<'REGEX'
/^[\w\-]+@[\w\-]+\.[a-zA-Z]{2,}$/
REGEX;
echo $pattern; // 输出完整字符串,不含换行符替换或变量展开
常见错误与避坑提醒
- 结束标识符缩进或带空格 → 报 Parse error:unexpected end of file
- 混用 heredoc 和 nowdoc 标识符(如起始带引号、结束不带)→ 语法错误
- 在 heredoc 中误写
{$arr['key']}却忘了数组变量已定义 → 运行时报 Notice - 用 heredoc 写 SQL 时未过滤用户输入 → 仍需防 SQL 注入,语法本身不提供安全保护
对比其他方式:什么时候不用 heredoc/nowdoc?
如果只是简单拼接两行,用双引号+\n 更轻量:
$msg = "第一行\n第二行";
如果字符串完全静态、无变量、无换行需求,单引号性能略优;而大量 HTML 或配置文本,heredoc/nowdoc 可读性和维护性明显更高。



















