PHPヒアドキュメントで$付き文字をそのまま出力する

phpでHTML出力する場合、htmlファイルをそのままテンプレートとして使用します。
htmlファイルであれば、テンプレートの修正等がやりやすいためです。
ですが、部分テンプレートの場合は少し事情が変わってきます。
例えば実績表示で、写真とタイトルを表示するためのテンプレートであれば、内容が少なくHTMLファイルにするまでもありません。
その場合は、PHPで変数として使用したほうが、HTMLの読み込みをしなくてもよい分軽くなります。
ですが、普通の変数だと文字列内に「"」を使用するときに\(エスケープシーケンス)をつけなければいけません。htmlタグを使用する場合「"」は頻繁に出てきます。
そこで、ヒアドキュメント形式で記載します。
ヒアドキュメントとは、開始位置から終了位置までも変数にする記述です。
これだと、「"」もそのまま記述できます。
ですが、それでも欠点があります。
それは、「$」付きの文字が、変数扱いになる点です。
変数をあてがう場合はそのままでもよいのですが、「$」を文字として出力したい場合困ります。
今回はヒアドキュメントで「$」を文字として出力する方法を調べました。
今回の現象はこちらです
以下のソースを実行すると、$varが変数扱いになります。
<?php
$var = "変数の中身";
$out_buff = <<< EOF
[$var] を表示します。
EOF;
echo $out_buff;
?>実行すると以下のように表示されました。
[変数の中身] を表示します。$varが変数扱いされて、$varの中身が代入されてひょうじされました。
これはこれでよいのですが、私は$varを文字として出力したいです。
ということで、$varを文字として出力する方法を調べました。
次のようにしたら、変数が文字として出力されました。
ヒアドキュメントで、変数を文字として出力する方法を調べたら、思ったより簡単なことでした。
以下のように記述するだけで、$varが文字として出力されました。
<?php
$var = "変数の中身";
$out_buff = <<< 'EOF'
[$var] を表示します。
EOF;
echo $out_buff;
?>これを実行すると、以下のように表示されました。
[$var] を表示します。$varが文字として出力されました。
でもこう思いませんか?
あれっ?どこが違うの?
EOFを’EOF’にすると、変数が文字として出力されます

パット見わかりにくいですが、$out_buff <<< 'EOF’ のEOFを"で囲うと変数が文字として出力されます。
何でと思いますが、理屈は以下の通りでした。
- 通常の変数も、$out_buff = '$var’; と記述すると文字として出力される
- EOFを’EOF’とすると、EOFの中身を"で囲うことになるため、変数が文字列扱いになる
なるほど、変数を"で囲えば文字列になるということがわかりました。
【疑問】変数と文字列を混在させる場合はどうすればよいのか?

ここで疑問がわきました。
$varを文字列、変数混在にする方法はないだろうか?
汎用性を考えるならば、混在にしたいケースもあります。
調べてみると、以下のようにすればできました。
<?php
$var = "変数の中身";
$out_buff = <<< EOF
[\$var] [$var]を表示します。
EOF;
echo $out_buff;
?>これを実行すると以下のようになりました。
[$var] [変数の中身]を表示します。片方は文字列として出力され、もう一方は変数として出力されました。
違いは、$の前に「\」(エスケープシーケンス)をつけたことです。
この方法ならば混在にできました。
まとめ

- ヒアドキュメントで変数をまとめて文字にするならば「’EOF’」
- 混在させるならば「EOF」で変数の前に「\」をつける
ちょっとしたことですが、奥の深い事柄でした。
























