在 PHP 開發中,處理大段字串或包含變數插值的文本時,heredoc 與 nowdoc 是兩個極為實用的語法結構。它們能讓程式碼更易讀、維護,避免大量跳脫字元的困擾。本文將詳細介紹兩者的語法規則、差異與實際應用場景。
heredoc 使用 <<< 運算子,後接一個自定義識別碼,換行後撰寫字串內容,最後以相同識別碼結尾。識別碼慣例使用大寫字母,結尾識別碼必須獨佔一行且前後無空白。
<?php $content = <<<FDIPZONE <html> <head> <title>test</title> </head> <body> <p><img src="https://www.csdn.net/css/logo.png"></p> <p><a href='https://blog.csdn.net/fdipzone'>blog</a></p> </body> </html> FDIPZONE; echo $content; ?>
<?php
class test {
public $var = '123';
public $a = <<<FDIPZONE
$var
FDIPZONE; // 錯誤:含變數的 heredoc 不能初始化屬性
}
$obj = new test();
echo $obj->a;
?>
<?php $var = '123'; $content = <<<FDIPZONE $var time(); FDIPZONE; echo $content; // 輸出:123 time() — 函式不會被執行 ?>
nowdoc 語法與 heredoc 類似,但識別碼需用單引號包裹(<<<'IDENTIFIER')。關鍵差別在於 nowdoc 不進行任何解析,內容視為純字面字串,非常適合嵌入 PHP 程式碼、SQL 語句或含大量特殊字元的文本,無需跳脫。
<?php
$code = <<<'PHPCODE'
<?php
echo "Hello \$name"; // 變數不會被解析
function test() {
return 1 + 2;
}
PHPCODE;
echo $code; // 原樣輸出上述程式碼
?>
| 特性 | Heredoc | Nowdoc |
|---|---|---|
| 語法標記 | <<<ID | <<<'ID' |
| 變數解析 | 是 | 否 |
| 跳脫序列 | 支援(如 \n, \t) | 不支援(視為字面) |
| 適用場景 | 需插入變數的模板、HTML 片段 | 程式碼片段、正則表達式、固定文本 |
SQL_QUERY, HTML_TEMPLATE)。const 或建構子賦值。善用 heredoc 與 nowdoc,能讓 PHP 字串處理更優雅、安全,是進階開發者的必備技能。