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

投稿日:2019年04月15日 08時31分27秒

概ねPHPで何か作るときはテンプレートエンジンSmartyにお世話になってます。
で下記の記事がありまして、クラスを使ってテンプレートエンジンを作るという事ができるのですね。基本phpのinclude文が極めて強力でこれを使えばテンプレート自体は取り込めますがスコープを付けたいですねという内容です。
PHPテンプレートエンジンを10行で自作する
PHP最小のテンプレートエンジン

ここではincludeをクラスから呼び出しています。include最強。スコープがあると内容を壊されたりしないので便利です。でももっと簡単にできるでしょうということで、焼き直してはありますがこれを1行で実行してみます。
まずテンプレート側のソースsample.htmlを書きます。PHPの部分は普通にPHPの全ての書式が使えます。require等でも書けますがエラーがあるとそこで止まってしまうのでincludeの方が良さげです。
テンプレート:sample.php

<html>
<meta charset="utf-8">
<h1>店名:<?php echo name; ?></h1>
<hr>
メニュー
<ul>
<?php for($i=0; $i<?php echo $foods[$i]; ?></li>
<?php } ?>
</ul>
</html>

これを呼び出すには関数を使います。
メイン:sample.php

function display($name,$foods){include('sample.html');};
$name  = '蓬莱';
$foods = array('大盛り炒飯', '餃子', 'ラーメン', '大盛り中華丼');
display($name,$foods);

これだけです。

関数にするとヘッダやテーブルなんかも自動的に作れます。
テンプレート:table.html

<table class="table">
<thead>
  <tr>
    <?php for($i=0; $i<count($tabledata[0]); $i++){ ?>
    <th><?php echo $tabledata[0][$i]; ?></th>
    <?php } ?>
  </tr>
</thead>
<tbody>
  <?php for($i=1; $i

メイン:menu.php

function header(){include('header.html');};
function table($tabledata){include('table.html');};
function footer(){include('footer.html');};
$menu = array(array('店名','ラーメン', '餃子', '焼き飯', '麻婆豆腐'),array('蓬莱','100円','200円','300円','400円'),array('ほていや','50円','60円','70円','80円'));

header();
table($menu);
footer();

headerやfooterは記載してませんがbootstrapを想定してます。このような関数群をまとめておけば色々使えるのではないでしょうか。
さらにテンプレートをスクリプト風に呼び出す事も可能です。
テンプレート:sample.html

<?php
   $data  = "\n";
   $data .= "\n";
   $data .= "\n";
   $data .= "{$name}\n";
   $data .= "\n";
   $data .= "\n";

メイン:main.php

function parts($name)
{
    include('sample.html');
    return $data;
}
$cmd = 'return parts("名前");';
echo eval($cmd);

テキスト中から特定のコマンドを切り出して置換すればWikiのようにもできるし、保存もできます。
要するにPHPのincludeはとても強力だということですね。

[<< mod_xsendfileを導入する]

[PHPでテンプレートエンジンを作る2 >>]