Heredoc 與 Nowdoc 是 PHP 定義多行字串的兩大語法,雖然手冊說明簡單,但實際開發中「結束標譤必須頂格寫」這一規則極易因縮排導致語法錯誤。本文系統整理兩者差異、版本需求、轉義行為與避坑指南。
| 特性 | Heredoc | Nowdoc |
|---|---|---|
| 起始標記 | <<< EOT | <<< 'EOT' |
| 引入版本 | PHP 4.0 | PHP 5.3 |
| 變數解析 | ✅ 自動解析 $var、{$obj->method()} | ❌ 完全不解析,視同單引號字串 |
| 轉義序列 | 支援 \n、\t、\\ 等 | 僅支援 \\ 和 \' |
| 結束標譤要求 | 頂格、獨佔一行、後接分號 | 同 Heredoc |
<?php
// ❌ 錯誤:EOD 前有縮排空格
$str = <<<'EOD'
Example of string
spanning multiple lines
EOD; // Parse error
// ✅ 正確:EOD 頂格
$str = <<<'EOD'
Example of string
spanning multiple lines
EOD; // OK
原因:PHP 解析器要求結束標譤必須從行首開始,任何前導空白/Tab 都會導致「找不到結束標譤」的編譯錯誤。
trim() 後處理。file_get_contents() 載入,徹底避開語法陷阱。<?php
$name = 'World';
$obj = new class { public function greet() { return 'Hello'; } };
echo <<<EOT
{$obj->greet()} {$name}!
// 輸出:Hello World!
EOT;
// 原樣輸出 $ 符號需轉義
echo <<<EOT
Price: \$100
EOT;
Heredoc = 雙引號多行版(動態插值)
Nowdoc = 單引號多行版(靜態字面)
結束標譤頂格寫,縮排空格是大敵
大段模板別硬寫,引擎載入更安穩