ob_get_contents()関数を利用したお手軽なテンプレートについて紹介したいと思います。

 おそらく大抵のPHPのアプリケーションであれば,Smartyなど何らかのテンプレートエンジンを使用していると思います。今回はHTMLの出力ではなく,もっと簡単にPHP内蔵の機能を使用してテンプレートを作る方法を紹介したいと思います。

 今回はメールの文面について考えてみましょう。Smartyを使用している場合は,fetch()メソッドを使用してテンプレートから変数を割り当てたメールの文面を作成するでしょう。ただ,SmartyをHTML用に立ち上げている場合に文字コードの変換であったり,コンパイルディレクトリやキャッシュ用のディレクトリを共有して問題になることもあるかもしれません。

 今回はPHP内蔵の出力制御関数を使用してPHPファイルをテンプレートとして扱います。まずは以下のスクリプトを見てください。

<?php

$list 
= array(
  
"key1" => "val1",
  
"key2" => "val2",
  
"key3" => "val3",
);

ob_start();
include(
"/path/to/template.php");
$body ob_get_contents
();
ob_end_clean();

 このスクリプトで使用するtemplate.phpを以下のように作成します。

<?php foreach($list as $key => $val): ?>
<?php 
echo $key ?>の値は<?php echo $val ?>

<?php endforeach; ?>

 template.phpを保存して先ほどのスクリプトを実行すると,$bodyに以下の文字列が代入されます。

key1の値はval1
key2の値はval2
key3の値はval3

 テンプレートエンジンに慣れているとtemplate.phpが若干読みづらいかもしれません。ただ,ちょっとしたテンプレートで,外部に保存しておきたいときなどは,Smartyの仕組みを使用してとやるよりもお手軽でしょう。

 では,先ほどのスクリプトを見てみましょう。といっても内部で実行しているのは非常に簡単なもので,以下の3つを実行しているだけです。

  • ob_start()関数でPHPの出力バッファを有効にする。
  • template.phpをインクルード
  • インクルードしたときの出力をob_get_contents()関数で$body変数に保存
  • 出力バッファにためられた内容をクリア

 PHPには,出力された内容をすぐにブラウザに送信するのではなくバッファにためておく仕組みがあります。この仕組みを今回は使用しているわけです。

 元からあるPHPの機能を使用するので,特に設定を行う必要もありません。複雑なテンプレートを構成する場合はやはり可読性の面からSmartyの方がよいですが,簡単なものであればこのようにささっと実装してしまうのも1つの手ではないでしょうか。

(アシアル 森川穣)


この記事は,アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは,他にもPHP最新ニュースや,困ったときのQ&A掲示板,初心者向けのPHP講座など,PHP開発者をサポートする情報を掲載しています。