博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
smarty太臃肿!手动原创一个视图模板引擎
阅读量:6242 次
发布时间:2019-06-22

本文共 7433 字,大约阅读时间需要 24 分钟。

hot3.png

file_name = $file_name;    }        /**     * 模板编译     */    public function complie() {        //将文件以数组的形式输出        $this->template_array = file($this->file_name);        //查找include        foreach ($this->template_array as $key => $value) {            $template_array[$key] = trim($value);            $mark = substr($template_array[$key], 0,8);            if ($mark == '{include')                 $this->INCLUDE[] = $key;        }        //include存在则合并包含文件        if (isset($this->INCLUDE)) {            $this->pregInclude();            foreach ($this->template_array as $key => $value) {                if (is_array($value)) {                    foreach ($value as $k => $v) {                        $include_array[] = $v;                    }                }                else {                    $include_array[] = $value;                }            }        }        else {            $include_array = $this->template_array;        }        unset($this->template_array);        unset($template_array);        foreach ($include_array as $k => $v) {            $array[$k] = trim($v);            $mark = substr($array[$k], 0,4);            switch ($mark) {                //foreach开始                case '{for':$this->FOREACH_START[] = $k;                break;                //foreach结束                case '{/fo':$this->FOREACH_END[] = $k;                break;                //if开始                case '{if ':$this->IF_START[] = $k;                break;                //else                case '{els':$this->IF_ELSE[] = $k;                break;                //if结束                case '{/if':$this->IF_END[] = $k;                break;            }        }        $this->template_array = $include_array;        unset($include_array);        /**         * 转为php标签         */        if (isset($this->FOREACH_START)) {            $this->pregForeachStart();            $this->pregEnd($this->FOREACH_END);        }        if (isset($this->IF_START)) {            $this->pregIfStart();            $this->pregEnd($this->IF_END);        }        if (isset($this->IF_ELSE)) {            $this->pregElse();        }        /**         * 写入文件         */        $template_string = $this->pregString();        $complie_file = basename($this->file_name); //产生缟译后的文件名        $result = file_put_contents($this->compile_dir.'/view/'.$complie_file, $template_string);        if (is_int($result))             return $template_string;        else return false;    }    /**     * 合并include文件     * @param string $key    :0     * @param string $value :{include file="/xx/xx.phtml"}     */    private function pregInclude() {        foreach ($this->INCLUDE as $value) {            $tmp = explode("\"", $this->template_array[$value]);            $path = "/yby/site/YAE/application/views$tmp[1]";            if (!file_exists($path)) exit('文件不存在');            $this->template_array[$value] = file($path);        }    }    /**     * 替换foreach开始标签     * @param unknown $key     * @param unknown $value     */    private function pregForeachStart() {        foreach ($this->FOREACH_START as $line) {            $value = $this->template_array[$line];            /**             * 分解foreach条件 "{foreach key=k value=data}"             * $foreach_condition[0] = "{foreach"              * $foreach_condition[1] = "key=k"             * $foreach_condition[2] = "data=$value}"             */            $foreach_condition = explode(' ', trim($value));            $foreach_condition_data = rtrim($foreach_condition[2],'}');            /**             * $data = "data"                * $val = "$value"             */            list($data,$val) = explode('=', $foreach_condition_data);            /**             * $key = "key"             * $k = "k"             */            list($key,$k) = explode('=', $foreach_condition[1]);            $replace = "
 $"."$data) {?>";            $this->template_array[$line] = $replace;         }    }    /**     * 替换if开始标签     * @param unknown $key     * @param unknown $value     */    private function pregIfStart() {        //$line 行号        foreach ($this->IF_START as $line) {            $value = $this->template_array[$line];            /**             * $if_condition = "$data.status == 0" or "$value == null" or "isset($value)"             */            $if_condition = substr(trim($value), 4);            $if_condition = rtrim($if_condition,'}');            $if_condition = explode(' ', $if_condition);            $count = count($if_condition);            switch ($count) {                case 1:                    $replace = "
";                break;                case 2:                break;                case 3:                    $if_condition_data = explode('.', $if_condition[0]);                    $num = count($if_condition_data);                    $data = $if_condition_data[0];                    for ($i = 1; $i < $num; $i++) {                        $data .= "['$if_condition_data[$i]']";                    }                    $replace = "
";                break;            }            $this->template_array[$line] = $replace;        }    }    /**     * 替换结束标签     * @param unknown $key     */    private function pregEnd($value) {        foreach ($value as $line) {            $replace = "
";            $this->template_array[$line] = $replace;        }    }    /**     * 替换else     * @param unknown $key     */    private function pregElse() {        foreach ($this->IF_ELSE as $line) {            /**             * $if_condition[0] :"{else}" or "{elseif *** == ***}" or "{elseif isset(***)}"             */            $if_condition = trim($this->template_array[$line]);            $if_condition = trim($if_condition,'{}');            $if_condition = explode(' ', $if_condition);            $count = count($if_condition);            switch ($count) {                case 1:                    $replace = "
";                    break;                case 2:                    $replace = "
";                    break;                case 4:                    $if_condition_data = explode('.', $if_condition[1]);                    $num = count($if_condition_data);                    $data = $if_condition_data[0];                    for ($i = 1; $i < $num; $i++) {                        $data .= "['$if_condition_data[$i]']";                    }                    $replace = "
";                    break;            }            $this->template_array[$line] = $replace;        }    }    /**     * 直接输出字符串     */    private function pregString() {        $template_string = implode('', $this->template_array);        /**         * $matches[0][$i] : "{$data.app_name}"         */        preg_match_all("/\{(\\$(\b\w+\b\.)+\b\w+\b)\}|\{(\\$\b\w+\b)\}/", $template_string, $matches);        if (!empty($matches[0])) {            foreach ($matches[0] as $key => $val) {                $value = trim($val,'{}');                $data = explode('.', $value);                $count = count($data);                $result = $data[0];                for ($i = 1; $i < $count; $i++) {                    $result .= "['$data[$i]']";                }                $replace = "
";                $template_string = str_replace($val, $replace, $template_string);            }        }        return $template_string;    }        public function __destruct() {        unset($this->template_array);    }}

转载于:https://my.oschina.net/voyage1314/blog/187224

你可能感兴趣的文章
以太坊Truffle框架构建Dapp
查看>>
闭包,sync使用细节
查看>>
Vue+thinkJs博客网站(一)之vue多页面应用的webpack3配置
查看>>
PHP面试题
查看>>
拖拽上传功能的实现及原理
查看>>
Spring校验@RequestParams和@PathVariables参数
查看>>
移动端H5页面阻止图片和文字被选中
查看>>
聊聊flink TaskManager的memory大小设置
查看>>
怎么将微博图片中的水印去掉
查看>>
[实践系列]Babel原理
查看>>
浅谈SLAM的回环检测技术
查看>>
GraphQL 在 koa 框架中的实践
查看>>
网站内部页面如何正确的微调
查看>>
dubbo源码解析(八)远程通信——开篇
查看>>
在Docker中使用Xdebug
查看>>
snabbdom.js(二)
查看>>
【跃迁之路】【657天】程序员高效学习方法论探索系列(实验阶段414-2018.12.01)...
查看>>
Testng(二):监听
查看>>
重构改善既有的代码设计(代码的坏味道)
查看>>
入门量子计算
查看>>