PHPプロ!TIPS+

ob_get_contentsを使用した簡単テンプレート

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つの手ではないでしょうか。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)