Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

前回の記事では、Smartyもどきのテンプレートエンジンを10行で作る方法を紹介しました。今回は extract() を使用しない、よりシンプルな形にまとめてみました。

【補足】
前回の記事で紹介した方法では extract() を使用していましたが、この関数は連想配列を単独変数に展開するため、実行速度・メモリの消費・既存変数との衝突、といった点で不利な傾向がありましたので、本記事での方法をおすすめします。

WEB上のファイル構成

Webフォルダ
|
+-- class/
|   |
|   +-- MyTemplate.class.php (1)
|
+-- template/
|   |
|   +-- sample.tpl.html (2)
|
+-- sample.php (3)

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

10行テンプレートエンジン

class/MyTemplate.class.php(UTF-8)
<?php
class MyTemplate
{
    function show($tpl_file)
    {
        $v = $this;
        include(__DIR__ . "/../template/{$tpl_file}");
    }
}
?>
  • 指定されたテンプレートを展開するだけのシンプルなクラスです
  • $v は、テンプレート側でデータ表示用の変数として使います
  • PHP5.3未満の場合は、__DIR__ の代わりに dirname(__FILE__) を使って下さい

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

template/sample.tpl.html(UTF-8)
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <h1>店名:<?php echo $v->name; ?></h1>
    <ul>
    <?php for($i=0; $i<count($v->foods); $i++){ ?>
        <li><?php echo $v->foods[$i]; ?></li>
    <?php } ?>
    </ul>
</body>
</html>
  • PHPコードが埋め込まれた、よくある形の html ファイルです

サンプル画面表示ファイル

sample.php(UTF-8)
<?php
include(__DIR__ . "/class/MyTemplate.class.php");

$tpl = new MyTemplate();
$tpl->name  = '悟空軒';
$tpl->foods = array('ラーメン', '餃子', '焼き飯', '麻婆豆腐');
$tpl->show('sample.tpl.html');
?>
  • 実際にブラウザーからアクセスするファイルです
  • たとえば URL は、http://(あなたのサイト)/sample.php という感じになります

まとめ

テンプレートエンジンとはいえ、PHPの基本機能を使っただけのシンプルな作りです。

特別な機能は何もないため、そういう恩恵を受けるメリットはありません。

その代わり、Smartyやフレームワークを使うことによる以下のデメリットからは解放されます。

  • フレームワーク固有の学習コスト
  • フレームワークをバージョンアップしていく手間
  • フレームワークと他のモジュールとの相性問題
  • フレームワークのブラックボックス部分による制限

(・o・ゞ いじょー。

参考URL

yasumodev
「長い旅行に必要なのは大きなカバンじゃなく、口ずさめる一つの歌さ」スナフキン
https://twitter.com/yasumodev
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away