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」で変数の前に「\」をつける

ちょっとしたことですが、奥の深い事柄でした。

今回のレポートは以上です。
読んでいただいてありがとうございました。


ホームページに関するお悩み事やご相談事がございましたら私どもまでご連絡ください。 鋭意ご対応申し上げます。
ホームページのご提案もさせていただいております