PHP には 100 万のテンプレート エンジン (Blade、Twig、Smarty、Mustache など) がありますが、私は HTML 内に PHP を記述するための新しい構文とコンパイラを作成するという考えが嫌いです! 私はそれがスマートではないと思います(しかし、これは私が議論するためにここにいるものではありません:))、PHP + HTMLを通常の方法で書くことの何が問題になっていますか-ロジックのためではありません-あなたが望むすべての変数とループと定義この {{% %}} または {:: ::} なしで使用してください! 少なくともパフォーマンスのために!
今、私は最近Laravelを使用していますが、それは素晴らしいです。(Blade やその他のサードパーティ エンジンに加えて) ob_start/include/ob_get_clean と eval を使用するプレーンな PHP テンプレート システムを提供します。HTML 内に PHP を記述するための新しい構文を学ばなくて済むことを知って、とてもうれしく思いました。
これが私が提案していることです。include で ob_* 関数を使用する代わりに Closures を使用するのはどうですか? これは、ポイントを作るためにまとめた単純なクラスです。
class Templates{
static public $templates = array();
static public function create($name, $code){
self::$templates[$name] = $code;
}
static public function run($name, $data){
if(!isset(self::$templates[$name]) || !is_callable(self::$templates[$name])) return false;
return call_user_func(self::$templates[$name], $data);
}
}
そして、これを使用する方法は次のとおりです。
Templates::create('test', function($data){
return 'Hi '.$data['name'].' ! ';
});
for($i =0; $i < 10; $i++){
print Templates::run('test', array('name' => 'Jhon'));
}
出力バッファリングを実行したり、eval を使用したりする必要がないため、この方法の方がはるかに優れていると思います。ここで「懸念事項を分離」するために、Templates::create コードを別のファイルに配置して、物事をきれいに保つことができます。実際、この方法で物事をよりシンプルかつエレガントにすることができます。テンプレート ファイルをロードする別の方法を作成できます。
static public function load($name){
self::create($name, include($name.'.php'));
}
テンプレート ファイルの内容は次のように単純になります。
return function($data){
return 'Hi '.$data['name'].' ! ';
};
これについてどう思いますか?Closures のそのような使用のアプローチまたはパフォーマンスに問題はありますか?