読者です 読者をやめる 読者になる 読者になる

絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

4+1行で作るPHP用テンプレートエンジン

php template neta

唐突に、PHP用のテンプレートエンジンを4+1行で実装してみる。


方針:

  • ふつうのPHPファイルをテンプレートとして使う。
  • <?php echo $var; ?> は面倒なので <?=$var ?> と書けるようにする。
  • <?php echo htmlspecialchars($var); ?> はもっと面倒なので <?=h($var)?> と書けるようにする。
  • ついでにXML宣言も <?=xml?>.... とかけるようにする。

コード:

.htaccess

php_value short_open_tag On

FiveLinesTemplate.php

<?php // FiveLinesTemplate.php 4行だけどネイティヴPHP並に早い。
function h($v) {return htmlspecialchars($v);}
define('xml', '<?xml');
@include_once($TEMPLATE);

サンプルPHPコード:

<?php
$TEMPLATE = "template.php";
$title = 'Example';
$list = array(10, '<A&amp;B>',NULL);
require_once('FiveLinesTemplate.php');

サンプルテンプレート:

<?=xml?> version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title><?=$title?></title>
  </head>
  <body>
    <h1><?=$title?></h1>
    <table>
<? foreach ($list as $i=>$item): ?>
      <tr bgcolor="<?= $i % 2 ? '#FFCCCC' : '#CCCCFF'?>">
        <td><?=$i?></td>
        <td><?=h($item)?></td>
      </tr>
<? endforeach ?>
    </table>
  </body>
</html>

出力例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
    <table>
      <tr bgcolor="#CCCCFF">
        <td>0</td>
        <td>10</td>
      </tr>
      <tr bgcolor="#FFCCCC">
        <td>1</td>
        <td>&lt;A&amp;B&gt;</td>
      </tr>
      <tr bgcolor="#CCCCFF">
        <td>2</td>
        <td></td>
      </tr>
    </table>
  </body>
</html>

え、冗談のつもりとか全然ないんですけど。
つまるところそういう事なんじゃ。

追記:ごめん原典忘れてた。あとほんのちょっとだけ変えた。
http://anond.hatelabo.jp/20071030034313

追記:id:rskyさんにxml定数の出力が実は間違ってるのを指摘されたので修正。
defineはマクロ的な利用は出来ない。。。orz