PHP EOF(heredoc) 使用说明
下面对 PHP 中的 Heredoc(以及它的“姊妹”Nowdoc)做一次深入详解,帮助你在处理多行字符串时得心应手。
1. 什么是 Heredoc
Heredoc 是一种语法结构,允许你在 PHP 代码中直接书写多行字符串,而无需手动转义引号或换行符。它的基本形式:
$str = <<<标识符
这里是多行
字符串内容,可以包含变量 $var
和各种引号 " ' 无需转义
标识符;
<<<
后跟一个 自定义的标识符(通常用大写字母或下划线),风格类似于EOF
、EOD
、HTML
等。- 结束时要在新的一行单独写上同样的标识符,后面必须紧跟分号
;
。
2. 语法规范
- 标识符命名
- 必须以字母或下划线开头,后续可跟字母、数字、下划线。
- 对大小写敏感,开始和结束标识符必须完全一致。
- 结束标识符的行首位置
- 结束标识符 必须 独占一行,前后不能有任何其他字符(包括空格、制表符)。
- 在 PHP 7.3+ 起,结束标识符可以缩进,但只能用空格,且缩进量要与开始对齐;旧版本不支持缩进。
- 括号用法
<<<标识符
后面不能有括号:<<<"EOD"
是 Nowdoc 语法,详见下文。
- 分号位置
- 结束标识符行的末尾直接加分号,不能换行放在下一行。
3. 变量解析与转义
- Heredoc(双引号风格)会解析其中的变量和转义字符(如
\n
、\t
):$name = "Alice"; $str = <<<EOT Hello, $name!\n 今日日期:{date('Y-m-d')} EOT; echo $str;
- 若要在字符串中保留
${}
等字面量,可使用反斜杠转义:$str = <<<EOT 这不是变量: \${notAVar} EOT;
4. Nowdoc(单引号风格)
Nowdoc 是 Heredoc 的“只读”版本,不会解析变量或转义字符,语法类似于单引号字符串:
$str = <<<'EOD'
这里的 $变量、\n 都会被原样输出,不会解析
EOD;
<<<'标识符'
(标识符用单引号包裹)即表示 Nowdoc。- 常用于嵌入大块静态文本,如 SQL 模板、HTML 片段。
5. 常见使用场景
- 嵌入 HTML 块
$title = "欢迎"; echo <<<HTML <div class="container"> <h1>$title,世界!</h1> <p>今天是: {date('Y-m-d')}</p> </div> HTML;
- 定义 SQL 模板
$table = 'users'; $sql = <<<SQL SELECT id, name, email FROM $table WHERE status = :status ORDER BY created_at DESC LIMIT 10; SQL;
- 生成配置文件
$config = <<<INI
[database]
host = localhost user = root password = secret INI; file_put_contents(‘db.ini’, $config);
6. 缩进支持(PHP 7.3+)
PHP 7.3 之后,Heredoc/Nowdoc 的结束标识符可以缩进,便于你在函数或类内部书写:
function render() {
$html = <<<HTML
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
HTML;
return $html;
}
注意:
- 缩进只能包含空格,不能包含制表符。
- 结束标识符的缩进量要与开始行起始对齐,否则会报语法错误。
7. 常见坑与注意
- 结束标识符前的空白
- 不能有任何输出(如空格或 UTF-8 BOM),否则会导致 “unexpected end of file” 或多余空格输出。
- 标识符冲突
- 避免在内容中无意出现与标识符相同的行,否则会提前结束字符串。
- 编码与 BOM
- 源文件应保存为无 BOM 的 UTF-8,否则可能使第一行标签无法识别。
- 多参数 echo
- 使用 Heredoc 时,如果想一次输出多个块,可在
echo
后接多个 Heredoc:echo <<<A Foo A, <<<B Bar B;
- 使用 Heredoc 时,如果想一次输出多个块,可在
8. 小结
- Heredoc:类似双引号字符串,解析变量和转义,适合动态内容。
- Nowdoc:类似单引号字符串,不解析任何内容,适合静态文本。
- 标识符命名与结束标识符行首对齐是关键,PHP 7.3+ 支持缩进对齐。
掌握了 Heredoc/Nowdoc,你就能轻松处理各种多行字符串场景,无需反复拼接或手动转义。祝编码顺利!