ヒアドキュメント - by shigemk2
PHP: 文字列 - Manual
終端 ID がある行には、セミコロン (;) 以外の他の文字が含まれていてはならない
ことに注意する。 これは特に ID はインデントしてはならないということ、
セミコロンの前に空白やタブを付けてはいけないことを意味する。
終端 ID の前の最初の文字は、使用するオペレーティングシステムで定義された
改行である必要があることにも注意を要する。
これは、例えば、Macintoshでは \r となる。
最後の区切り文字 (たいていはその後にセミコロンが続きます) の後にもまた、
改行を入れる必要がある。
この規則が破られて終端 ID が "clean" でない場合、
終端 ID と認識されず、PHP はさらに終端 ID を探し続ける。
適当な終了 ID がみつからない場合、 スクリプトの最終行で
パースエラーが発生してしまう。
要するに、
<?php class foo { public $bar = <<<EOT bar EOT; } ?>
EOTの後に空白やインデントを置いてはいけない、ということである。
また、PHP 5.3.0 以降では、
ヒアドキュメントの宣言をダブルクォートで囲めるようになった。
<?php echo <<<"FOOBAR" Hello World! FOOBAR; ?>
(ヒアドキュメント自体はPHP4以降での実装)
Nowdoc
ヒアドキュメントのID部分をシングルクォートで囲んだものは、
ヒアドキュメントとは呼ばず、Nowdocという。
中身についてのパース処理を行わないヒアドキュメントと解釈してよい。
<?php $str = <<<'EOD' Example of string spanning multiple lines using nowdoc syntax. EOD; /* 変数を使った、より複雑な例 */ class foo { public $foo; public $bar; function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; echo <<<'EOT' My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should not print a capital 'A': \x41 EOT; ?>
つまり、ヒアドキュメントかNowdocかどちらを使うか迷うときは、
パース処理を行うか行わないかで判断するとよい。