日記
PHPでコードビハインド(@ASP.NET)風に記述してみるテスト (13:51)Edit

ひとまずこのレベルならばふつうに動く。ごついクラスを作ってかぶせれば、もっとASP.NETっぽいこともいろいろできるだろう(簡略化のために以下のサンプルではshort_open_tagをonにしているけれども、個人的にはshort_open_tagをoffにしつつ、phpx側の処理にもう一段ラッピングするアプローチの方がいいと思う。イベントハンドラもどきみたいなこともできるだろうし)。

ただ問題は、コードビハインド風の記述方法がさしてすばらしいとは思えないところにある。コンパイル言語ならば、ロジックをコードビハインドに分離しておいてそっちはコンパイルしつつ、テンプレート的な部分は自由に変更できる、というアプローチもそれなりに有効だろうが。

でもまあ、一般的なテンプレートエンジンを使った記述方法よりも、テンプレートとファイル(URL)とロジックの関係が明確になるという利点は結構捨てがたいかも。一般的なテンプレートエンジンを使うと、パーツのテンプレートファイルと本体のテンプレートファイルの管理がいまいちきれいにできないんだよな。でもその利点のためだけにこれだけのオーバーヘッドを許容できるかなー。

.htaccess

AddType application/x-httpd-php    .phpx
php_value short_open_tag        on
php_value auto_prepend_file     code_behind_engine.php

code_behind_engine.php

<?php
_CBE_EXECUTE();
function _CBE_EXECUTE() {
$__currentFile = $_SERVER['DOCUMENT_ROOT'].$_SERVER['SCRIPT_NAME'];
$__scriptFile = $__currentFile.'.php';
if (file_exists($__scriptFile)) {
include $__scriptFile;
}
include $__currentFile;
exit;
}
function h($str) {return htmlspecialchars($str);}
?>

test.phpx

<html>
<head>
<title><?=h($title) ?></title>
</head>
<body>
<h1><?=h($title) ?></h1>
<ul>
<?php foreach ($hash as $key => $value): ?>
<li><?=h($key) ?> is <?=h($value) ?></li>
<?php endforeach; ?>
</ul>
</body>
</html>

test.phpx.php

<?php
$title = 'テスト';
$hash = array(
'123' => 'abc',
'あいう' => 'XYZ',
'http://ishinao.net/' => 'ishinao@ishinao.net',
'<b>aaa</b>' => 'bold'
);
?>

実行例

Published At2004-04-21 00:00Updated At2004-04-21 00:00