ホームページ制作 オフィスオバタ

PHPでヒアドキュメント構文の中にヒアドキュメントを記述した。

というように、EOFの名前を変えればよい。

PHPでヒアドキュメントを使用するケースがしばしばあります。
ヒアドキュメントとは以下のような記述のことです。

$text = <<< EOF
<div class="box">
<img src="sample.jpg">
<p>テキスト文字</p>
</div>
EOF;

<<< EOFからEOF;までの間の記述を変数に代入します。

今回、次のようなことをやってみたいと思いました。

ヒアドキュメントの中にヒアドキュメントを記述したい。

どういうことかというと、次のような記述をしてみたいと思いました。

$output = <<< EOF
$text = <<< EOF
<div class="box">
<img src="sample.jpg">
<p>テキスト文字</p>
</div>
EOF;
EOF;

EOF の中に、EOFを記述するです。
ところが、この記述ではPHPエラーになりました。
当たり前といえば当たり前ですが、「EOFが複数ありおかしい」というようなエラーでした。
色々調べて対処できましたので、忘備録として記録いたします。

結果から言うと、次の記述でうまくいきました。

$output = <<< OUTPUT
¥$text = <<< EOF
<div class="box">
<img src="sample.jpg">
<p>テキスト文字</p>
</div>
EOF;
OUTPUT;

この記述で変数$outputの中に、ヒアドキュメントをセットできました。

ですが、よくよく見ると疑問がわいてきます。
一つ一つ整理していきます。

ヒアドキュメントの中にヒアドキュメントを記述する場合の疑問

(1)=<<< OUTPUT ってなに?

ヒアドキュメントといえば、EOFじゃないの?
と思いがちです。
かくいう私も、EOF自体が文法的な命令だと思っていました。

ですが誤りでした。
正確には、任意のIDを指定しているだけでした。

EOFは文例ではよくありますが、任意の文字列なので、EOFを別の名称に書き換えてもOKです。
今回OUTPUTという任意の文字列を指定していますが、これでも正しく動作しました。

予約語等はエラーになるかもしれませんが、名前被りしない任意の名称であればなんでもOKです。

(2)$textに¥をつけているのはなぜ?

ヒアドキュメント内に変数($のついた名将)を記述すると、値が代入されます。
存在しない変数の場合はNULL(空白)が設定されます。

つまり$text = <<< EOF という記述が、= <<< EOF という風に書き換わってしまいます。
それを避けるために、$textを¥$textと記述しています。

そもそもヒアドキュメントの中にヒアドキュメントを記述する理由

ヒアドキュメントの特色は、そのまま記述できる点にあります。
例えばHTMLを変数に代入する場合、width=”200″ というような記述は、width=¥”200¥” というように、エスケープシーケンスと言われる、誤変換防止処置をしなくてはいけません。

これがヒアドキュメントだと、エスケープシーケンスを盛り込まなくてもエラーになりません。

ということは、キャッシュとして使えると思いました。

普通のキャッシュは、外部にテキストファイルを生成し、そのファイルを読み込んで使用します。
ですが、変数としてキャッシュ出力すれば、ファイル読み込みしなくても中身を取り出せます。

キャッシュファイルを読み込む処理を省くことで次の効果が期待できます。

事実やってみると、キャッシュ処理がものすごい楽になりました。
事前にrequire_once()でキャッシュファイルを指定しておく必要がありますが、必要な手間はそれだけです。しかもfile()関数でファイルを読み取るよりも速く、すでに変数化されているため扱いやすいです。

当然キャッシュなので、流動的な内容を出力します。
その際に、その都度エスケープシーケンス処置を入れる手間がないヒアドキュメントが便利というわけです。

キャッシュファイルに、ヒアドキュメントの記述を出力する。
ということを実現するために、ヒアドキュメントの中にヒアドキュメントを記述する必要があったのです。

1%のひらめきは99%の努力と同等。

エジソンの言葉に、発明には99%の努力が必要である。
というものがあります。

実際そうだと思います。
どんなに素晴らしいアイディアでも、具現化できなければ絵にかいた餅です。

ですが、1%のひらめきもとても大事だと思います。
なぜならば、99%の努力をする価値があるからです。

モバイルバージョンを終了