by shigemk2

当面は技術的なことしか書かない

ヒアドキュメント、Nowdoc

ヒアドキュメント - 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かどちらを使うか迷うときは、
パース処理を行うか行わないかで判断するとよい。