PHP EOF(heredoc)
`heredoc` 与 `nowdoc` 的语法、缩进规则、以及常见用途。
heredoc
<?php
$name = "张三";
$age = 28;
$text = <<<EOT
你好,{$name}。
你今年 {$age} 岁。
这里的换行、引号 "都不需要转义"。
EOT;
echo $text, "\n";你好,张三。
你今年 28 岁。
这里的换行、引号 "都不需要转义"。Content starts on the line after <<<EOT and ends at a line with just EOT;. Newlines and quotes are literal while variables still interpolate — ideal for HTML fragments and SQL.
nowdoc
<?php
$name = "张三";
$raw = <<<'EOT'
变量 $name 不会解析,\n 也不转义。
适合放代码示例或纯文本。
EOT;
echo $raw, "\n";变量 $name 不会解析,\n 也不转义。
适合放代码示例或纯文本。| Form | Interpolates | Escapes |
|---|---|---|
<<<EOT | 是 | 是 |
<<<'EOT' | 否 | 否 |
缩进规则(PHP 7.3+)
<?php
function render(): string
{
$items = ['苹果', '香蕉'];
$html = <<<HTML
<ul>
<li>{$items[0]}</li>
<li>{$items[1]}</li>
</ul>
HTML;
return $html;
}
echo render(), "\n";<ul>
<li>苹果</li>
<li>香蕉</li>
</ul>Since PHP 7.3 the closing marker's indentation is stripped from every line. Above, HTML; is indented 8 spaces so each line loses 8 — letting heredoc sit naturally inside indented code.
; after. Mixing tabs and spaces triggers Invalid body indentation level.典型用途
<?php
// 1. 拼 SQL
$table = "users";
$sql = <<<SQL
SELECT id, name, email
FROM {$table}
WHERE status = 'active'
ORDER BY id DESC
LIMIT 10
SQL;
echo $sql, "\n\n";
// 2. 生成邮件正文
$body = <<<MAIL
尊敬的客户:
您的订单已发货。
感谢您的支持!
MAIL;
echo $body, "\n";SELECT id, name, email
FROM users
WHERE status = 'active'
ORDER BY id DESC
LIMIT 10
尊敬的客户:
您的订单已发货。
感谢您的支持!Heredoc beats concatenation for SQL: no missing spaces, no quote escaping. But interpolating variables is still injectable — use prepared statements for real queries (see the PDO chapter).
heredoc
<?php
$name = "张三";
$age = 28;
$text = <<<EOT
你好,{$name}。
你今年 {$age} 岁。
这里的换行、引号 "都不需要转义"。
EOT;
echo $text, "\n";你好,张三。
你今年 28 岁。
这里的换行、引号 "都不需要转义"。<<<EOT 之后换行开始内容,单独一行写 EOT; 结束。内容里的换行、单双引号都按字面处理,变量照常解析——写 HTML 片段和 SQL 时非常方便。
nowdoc
<?php
$name = "张三";
$raw = <<<'EOT'
变量 $name 不会解析,\n 也不转义。
适合放代码示例或纯文本。
EOT;
echo $raw, "\n";变量 $name 不会解析,\n 也不转义。
适合放代码示例或纯文本。| 写法 | 解析变量 | 转义 |
|---|---|---|
<<<EOT | 是 | 是 |
<<<'EOT' | 否 | 否 |
缩进规则(PHP 7.3+)
<?php
function render(): string
{
$items = ['苹果', '香蕉'];
$html = <<<HTML
<ul>
<li>{$items[0]}</li>
<li>{$items[1]}</li>
</ul>
HTML;
return $html;
}
echo render(), "\n";<ul>
<li>苹果</li>
<li>香蕉</li>
</ul>PHP 7.3 起,结束标记的缩进会从每一行里剥掉。上面 HTML; 缩进 8 个空格,所以内容每行也去掉 8 个空格。这让 heredoc 能自然嵌在缩进代码里。
; 不能再有别的字符。缩进混用 Tab 和空格会报 Invalid body indentation level。典型用途
<?php
// 1. 拼 SQL
$table = "users";
$sql = <<<SQL
SELECT id, name, email
FROM {$table}
WHERE status = 'active'
ORDER BY id DESC
LIMIT 10
SQL;
echo $sql, "\n\n";
// 2. 生成邮件正文
$body = <<<MAIL
尊敬的客户:
您的订单已发货。
感谢您的支持!
MAIL;
echo $body, "\n";SELECT id, name, email
FROM users
WHERE status = 'active'
ORDER BY id DESC
LIMIT 10
尊敬的客户:
您的订单已发货。
感谢您的支持!SQL 用 heredoc 比用字符串拼接安全得多——不会漏空格、不用处理引号转义。但变量插值进 SQL 仍有注入风险,实际查询要用预处理语句(见 PDO 章节)。