4+1行で作るPHP用テンプレートエンジン
唐突に、PHP用のテンプレートエンジンを4+1行で実装してみる。
方針:
- ふつうのPHPファイルをテンプレートとして使う。
- <?php echo $var; ?> は面倒なので <?=$var ?> と書けるようにする。
- <?php echo htmlspecialchars($var); ?> はもっと面倒なので <?=h($var)?> と書けるようにする。
- ついでにXML宣言も <?=xml?>.... とかけるようにする。
コード:
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&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><A&B></td> </tr> <tr bgcolor="#CCCCFF"> <td>2</td> <td></td> </tr> </table> </body> </html>
え、冗談のつもりとか全然ないんですけど。
つまるところそういう事なんじゃ。
追記:ごめん原典忘れてた。あとほんのちょっとだけ変えた。
http://anond.hatelabo.jp/20071030034313
追記:id:rskyさんにxml定数の出力が実は間違ってるのを指摘されたので修正。
defineはマクロ的な利用は出来ない。。。orz