1

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 のそのような使用のアプローチまたはパフォーマンスに問題はありますか?

4

1 に答える 1

1

すべてのクロージャー関数を配列に入れると、関数が基本的に同じことをしていることを意味する可能性があるということ以外に問題はないと思います。

これが意味すること:

あなたの例では、関数が1つのパラメーターのみを受け入れるようになっています。したがって、作成するすべての関数を混乱させないようにしaccept the same set of parametersますreturn the same type of data

ただし、別々に宣言されている場合、関数は異なる独自のことを行うと想定される場合があります。

このようなソリューションが適している理由: 一部のエンジンを使用する場合、すでに宣言されているさまざまな関数が多数ある場合があります。競合を解決するために、それらを配列内に「隠す」ことができます。

また、匿名関数の方が一般的にパフォーマンスが優れていると言う人さえいます。しかし、最初にそれをテストする必要があります: 関数を呼び出すには:

  1. 静的関数を呼び出すrun
  2. 関数の存在を確認する
  3. 関数の呼び出し可能性をチェックする
  4. そしてcall_user_func、関数の戻り値を返す which を使用します。つまり、3倍のリターン。

Update

あなたのコードに対する私の推奨事項:

関数を作成する場合にのみ、すべての可能なチェックを行います。これにより、パフォーマンスが大幅に向上します。

static public function create($name, $code){
  if (!isset(self::$templates[$name])){
    if (is_callable($code)){
      self::$templates[$name] = $code ;
    } else {
      //func is not callable, Throw an exception.
    }
  } else {
    //function already exists. Throw an exception.
  }
}

そうすれば、パフォーマンスを 2 倍にすることができます。

static public function run($name, $data){
  if (isset(self::$templates[$name])){
    self::$templates[$name]($data); //Just make a straight call
  } else {
    //throw new Exception(0, "The func is not defined") ;
  }
}
于 2013-06-22T15:13:47.217 に答える