[PHP-users 1807] Re: FastTemplate その後

Osamu Shigematsu php-users@php.gr.jp
Wed, 05 Sep 2001 12:01:48 +0900


重松です。大垣さん、こんにちは。

on 01.9.5 10:02 AM, Yasuo Ohgaki at yohgaki@hotmail.com wrote:

> なぜか多くのTemplateが実装されているので、こんな物をzend.comに入れてお
> きました。
> 
> http://www.zend.com/codex.php?id=640&single=1

拝見しました。
さらなる高速化のためにいくつかの重要なテクニックを知ることができました。
ありがとうございます。

いちいち正規表現などを使ってちまちま自前で変数を展開する必要がなく、
配列などもそのまま使える、というメリットがありますね。
速度も随分向上しそうです。

単純な構造のものは、大垣さんの示された手法で、
PHP と HTML を分離できると思います。

以下もう少しだけ実用的なものを適当に考えてみました。:-)
が、動くかどうか試していません。
ちゃんと、テンプレートの入れ子と、登録した変数の対応ができていないので、
TABLE や ROW というように同じパーツが重複する構成はできないですし、
ROW のように増える部分 (FastTemplate の場合、. をつけて処理する部分) に
対応していないです。

    - HTML
        - HTMLHEADER
        - HTMLBODY
            - HEADER
            - MAIN
                - TABLE
                    - ROW
            - FOOTER
            - DEBUG
                - TABLE
                    - ROW

FastTemplate を読み切っていないので、どうやって入れ子の管理をしているのか、
もう一度よく理解していきたいと思います。

lass faster_template{
    var $tpl_name;
    var $data = array();

    function faster_template($tpl_name){
        $this->tpl_name = $tpl_name;
    }

    function register($pairs,$namespace=''){
        if(!$namespace)
            $namespace = 'GLOBALS';
        if(is_array($pairs))
            $this->data[$namespace] =
                array_marge($this->data[$namespace],$pairs);
    }
    
    function unregister($keys,$namespace=''){
        if(!$namespace)
            $namespace = 'GLOBALS';
        if(!is_array($keys))
            $keys = array((string)$keys);
        foreach($keys as $key){
            //if(!empty($this->data[$namespace][$key]))
                unset($this->data[$namespace][$key]);
        }
    }
    
    function parse(){
        extract($this->data[GLOBALS]);
        extract($this->data[$this->tpl]);
        
        ob_start();
        include($this->tpl . '.tpl');
        $html = ob_get_contents();
        ob_end_clean();
        
        while(!eregi($html,'[{]\s*([_A-Z][_A-Z0-9]*)\s*[}]',$match)){
            if(!$match[1]) continue;
            $this->tpl_name = $match[1];
            $html = replace($html,$match[0], $this->parse());
        }
        return $html;
    }

    function faster_print(){
        print $this->parse();
    }
}

-- 
Osamu Shigematsu

http://www.ravi.ne.jp/
mailto:shige@ravi.ne.jp