PHP ヒアドキュメントの使い方:2通り

PHPでのヒアドキュメントの使い方…。
職業訓練の講義で教わったのは

1 : print や echo で使う

print <<< EOF

〜複数行の文を直接記述〜
$hoge ←変数は展開される

EOF;

というものでした。


てっきり、『print』や『echo』とセットでしか使えないのかと
思ってましたが、変数内で使うこともできるようで…。

2 : 変数内で使う

$name = '田中';
$sex = '男';

$hoge = <<< EOF
<p>
私の名前は $name です。<br>
私の性別は $sex です。
</p>
EOF;

echo $hoge;


ところで、以前は、ヒアドキュメント内では配列やオブジェクトのメンバ変数
使えないものと勘違いしていたため、

  • 変数に代入してから使う
  • 一時的にヒアドキュメントを中断する
  • 『printf()』を使う
などの苦肉の策を講じていましたが、id:Akaza さんから、『{ }』を使えばよいと
教えていただきました。
3 : 配列や、メンバ変数を展開させたい

$hoge = <<< eof
<p>
私の名前は {$obj->name} です。<br>
私の性別は {$sex[0]} です。
</p>
eof;


//なお、通常のダブルクォーテーションで囲まれた文字列でも同じです。
$piyo = "私の出身は {$prefecture[24]} です。";

Akazaさん、どうもありがとうございました。m(_ _)m



ちなみに…、

4 : printf()を使う方法

$hoge = <<< eof
<p>
私の名前は %s です。<br>
私の年齢は %d です。
</p>
eof;
printf($hoge, $obj->name, $obj->age);
【3】と比べてわかりやすいような…わかりにくいような…?



追記 2012-09-08
どうでもいいことですが、私はヒアドキュメントの終了の識別子の後のセミコロン(;)は必須だと勘違いしていました。
が、そもそもセミコロンは特例として識別子の後につけることを許されているのだそうです。
つまり、本来はこうするべきなのだそうです。

$hoge = <<< EOF
abcd
efgh
ijkl
EOF
;
識別子とセミコロンとは、何の関連もないということですね。
そうなると、今日ちょっとつまづいたことの原因もよく分かりました。
連想配列の値をヒアドキュメントで記述する、というコード。

(CakePHP)
echo $this->Form->textarea('tags', array(
'rows' => 8,
'cols' =>40,
'value'=> <<< EOF
abcd
efgh
ijkl
EOF
));
終了の識別子の後にセミコロンをつけたら、エラーになっちゃいましたよ…(^ ^;)
私の所持しているオライリー本の『プログラミングPHP 第2版』には、セミコロンの特例についてきちんと書かれていました。
おみそれしましたー m(_ _)m