78
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPテンプレートエンジンを10行で自作する

Last updated at Posted at 2014-05-09

【追記】
続編の記事「続・PHPテンプレートエンジンを10行で自作する」では、extract() を使用しない、よりシンプルな方法でまとめています。

yotsuba_s.jpg はじめに

PHPのテンプレートエンジンといえばSmarty(最近ではTwig?)が有名ですが、Smartyの文法や作法をひと通り覚え、それに従う必要があります。しかし、もともとPHPには <?php echo "Hello!"; ?> というふうに、HTMLへの埋め込み表示機能がありますので、これとinclude文を利用すると、テンプレート表示の仕組みは10行ほどで作れてしまいます。自作テンプレートだとPHPの知識だけで事足りますので、新しいことを覚える必要はありません。

yotsuba_s.jpg WEB上のファイル構成

Webフォルダ
|
+-- class/
|   |
|   +-- MyTemplate.class.php
|
+-- template/
|   |
|   +-- sample.tpl.html
|
+-- sample.php

全部で3ファイルです。上のファイルから順に解説します。

yotsuba_s.jpg 10行テンプレートエンジン

class/MyTemplate.class.php(UTF-8)
<?php
class MyTemplate
{
	function show($tpl_file_path)
	{
		extract((array)$this);
		include($tpl_file_path);
	}
}
?>

yotsuba_s.jpg サンプル画面テンプレートファイル

template/sample.tpl.html(UTF-8)
<html>
<meta charset="utf-8">
<h1>店名:<?php echo $name; ?></h1>
<hr>
<ul>
<?php for($i=0; $i<count($foods); $i++){ ?>
	<li><?php echo $foods[$i]; ?></li>
<?php } ?>
</ul>
</html>

このテンプレートファイルはinclude文で読み込まれるため、お使いのサーバーによっては拡張子を.phpとする必要があります(コメント欄参照)。さくらレンタルサーバーやさくらVPSでは、.htmlのままでも問題ありません。

ただ、拡張子が.htmlのままだとブラウザーでソースが表示されてしまいますので、留意しておく必要があります。

あと、テンプレートファイル内のPHP処理を for(): ~ endfor などの代替構文で書く場合もあります。可読性が良くなる反面、「テンプレートは代替構文で」というルールが1つ増えてしまいますので、一長一短ではあります。そこはお好みでどうぞ。

yotsuba_s.jpg サンプル画面実行ファイル

sample.php(UTF-8)
<?php
include("class/MyTemplate.class.php");
$tpl = new MyTemplate();
$tpl->name  = '悟空軒';
$tpl->foods = array('ラーメン', '餃子', '焼き飯', '麻婆豆腐');
$tpl->show('template/sample.tpl.html');
?>

churippu_s.png参考URL

(・o・ゞ いじょー。

78
77
14

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
78
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?