1

独自のテンプレート エンジンを作成しようとしています (理由は聞かないでください)。

そして作ってみます:

{{@Form::input("name")}}

私のレンダリング システムでは、次の評価コードを作成します。

    preg_match_all('/\{\{\@(.*?)\}\}/is',$data,$output);

    $out="";

    foreach ( $output[1] as $variables):
        $find = '{{@' . $variables . '}}';

        $data = str_replace($find, eval($variables), $data);
    endforeach;

しかし、私はこのエラーが発生しています

 Parse error: syntax error, unexpected $end in /home/psafari/public_html/slt/classes/template.class.php(43) : eval()'d code on line 1

テンプレートエンジンで指定されているように、「Form::input('something')」を実行する必要があります。私は何を間違っていますか?

4

1 に答える 1

0

新しいテンプレート エンジンの構築に反対するコメントが既にuberに関連しているにもかかわらず、見つかった文字列を分割することをお勧めします。の例を挙げると{{@Form::input("name")}}、{{@ CLASS_NAME :: FUNCTION_NAME ( params )}} になります。したがって、正規表現を使用すると、見つかった文字列を分割し (既に行っているように)、検出されたクラスのインスタンスを作成または参照し、動的呼び出しを使用して解析されたメソッドを呼び出すことができます (いずれかが見つからない場合は明らかに失敗/エラーになります)。

パラメーターについては、修飾子 (この場合は引用符) を避けてコンマごとに分割するか、修飾子を使用して正規表現を介して別の方法で解析することができます。あなたの電話。解析されて見つかった各パラメーターについて、関数呼び出しに追加されます。を回避するためevalに、また、PHP が乱数の引数をサポートしていないという事実 (Python がargsandを使用する場合などkwargs) を考慮して、テンプレート ファイルで使用する関数の単一パラメーターとして配列を使用します。

また、特定の数のパラメーターを受け入れ、関数 (またはクラス + 関数名) を受け取り、見つかったパラメーターの数をカウントし、最終的に実際の基礎となる関数への呼び出しを中継する、ある種の「インターフェイス」関数を使用することもできます。見つかったパラメーターの正しい数。追加すればするほど処理は不明瞭になりますが、テンプレート エンジンのユーザーが新しいテンプレート メソッドを定義できると仮定すると、この 2 番目のルートを使用するのは非常に悪い考えです(これらのインターフェイス関数)。

于 2013-08-11T00:28:29.023 に答える