Heredoc 與 Nowdoc 是 PHP 處理大段多行字串的專用語法,避免繁瑣的引號轉義與串接,特別適合 HTML 模板、SQL 語句、文檔生成等場景。
<?php
$name = '張三';
$html = <<<HTML
<div class="user-card">
<h2>歡迎,{$name}</h2>
<p>今天是 <?= date('Y-m-d') ?></p>
</div>
HTML;
echo $html;
// 輸出解析後的 HTML,變量 {$name} 被替換
?>
<?php
$code = <<<'PHP'
<?php
echo "這裡的 \$var 不會被解析";
echo '單引號也原樣輸出';
?>
PHP;
echo $code; // 原樣輸出,適合嵌入代碼片段
?>
| 規則 | Heredoc | Nowdoc |
|---|---|---|
| 開始標記 | <<<IDENTIFIER | <<<'IDENTIFIER' |
| 結束標記 | IDENTIFIER; (獨佔一行、行首、無縮進、無空格) | 同 |
| 標記命名 | 字母數字下劃線,慣用大寫 (EOF, EOT, HTML, SQL) | 同 |
| 內容行 | 可包含變量、轉義序列 | 原樣輸出,不解析 |
<?php
// ❌ 錯誤:結束標記有縮進
$str = <<<EOF
content
EOF; // Parse error
// ❌ 錯誤:結束標記後有空格
$str = <<<EOF
content
EOF ; // Parse error
// ❌ 錯誤:開始標記與內容同行
$str = <<<EOF content EOF; // Parse error
// ✅ 正確
$str = <<<EOF
content
EOF;
?>
<?php
$arr = ['name' => 'John'];
$obj = new class { public $age = 25; };
$str = <<<EOT
簡單變量:$name
陣列元素:{$arr['name']} // 必須用大括號
物件屬性:{$obj->age} // 必須用大括號
複雜表達式:{$arr['name'] . '!'}
這些不解析:$arr[name], $obj->age (無大括號)
EOT;
?>
| 場景 | 範例 |
|---|---|
| HTML 模板片段 | <<<HTML ... HTML; |
| SQL 語句 (含換行縮進) | <<<SQL SELECT ... SQL; |
| 郵件/通知模板 | <<<EMAIL 親愛的 {$user}... EMAIL; |
| 代碼生成/文檔輸出 | <<<'CODE' ... CODE; (Nowdoc) |
| JSON 模板 | <<<JSON {"name": "{$name}"} JSON; |
readonly 類屬性配合建構式替代大段字串拼裝HTML、SQL、JSON、EMAIL{$var} 包裹,避免歧義file_get_contents()Heredoc/Nowdoc 是 PHP 字串處理的「瑞士刀」,善用能大幅提升模板、SQL、文檔生成代碼的可讀性與維護性。