[李景山php]thinkphp核心源码注释|Taglib.class.php

来源:互联网 发布:win32编程还有用吗 编辑:程序博客网 时间:2024/06/05 16:03
<?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]// +----------------------------------------------------------------------// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: liu21st <liu21st@gmail.com>// +----------------------------------------------------------------------namespace Think\Template;/** * ThinkPHP标签库TagLib解析基类 * 这个基础类,好像是跟那个差不多呢 */class TagLib {    /**     * 标签库定义XML文件     * @var string     * @access protected     */    protected $xml      = ''; // 保存的文件    protected $tags     = array();// 标签定义    /**     * 标签库名称     * @var string     * @access protected     */    protected $tagLib   ='';// 标签库名称    /**     * 标签库标签列表     * @var string     * @access protected     */    protected $tagList  = array();    /**     * 标签库分析数组     * @var string     * @access protected     */    protected $parse    = array();    /**     * 标签库是否有效     * @var string     * @access protected     */    protected $valid    = false;    /**     * 当前模板对象     * @var object     * @access protected     */    protected $tpl;    protected $comparison = array(' nheq '=>' !== ',' heq '=>' === ',' neq '=>' != ',' eq '=>' == ',' egt '=>' >= ',' gt '=>' > ',' elt '=>' <= ',' lt '=>' < ');    // 对标签的一定 处理,标签 很重要    /**     * 架构函数     * @access public     */    public function __construct() {        $this->tagLib  = strtolower(substr(get_class($this),6));// 如果这样写的话,对于基类 一点意义也没有呢        // substr get_class($this) TagLib        $this->tpl     = \Think\Think::instance('Think\\Template'); // 实例化模版了    }// 初始化了 这里的  taglib 其实是没什么的了 ,    // tpl 就是个 new 一下 Think\Template 了    /**     * TagLib标签属性分析 返回标签属性数组     * @access public     * @param string $tagStr 标签内容     * @return array     */    public function parseXmlAttr($attr,$tag) {        //XML解析安全过滤        $attr   =   str_replace('&','___', $attr);// 你这个替换是弄啥赖,哈哈        $xml    =   '<tpl><tag '.$attr.' /></tpl>';        $xml    =   simplexml_load_string($xml); // 返回类 SimpleXMLElement 的一个对象,该对象的属性包含 XML 文档中的数据。如果失败,则返回 false。        if(!$xml) {            E(L('_XML_TAG_ERROR_').' : '.$attr);        }// 如果没有获取到 对应        $xml    =   (array)($xml->tag->attributes());// 获取到对应的属性数组        if(isset($xml['@attributes'])){            $array  =   array_change_key_case($xml['@attributes']);            if($array) { // 如果已经 包含 了数据                $tag    =   strtolower($tag);// 获取了 这里的 小写                if(!isset($this->tags[$tag])){                    // 检测是否存在别名定义                    foreach($this->tags as $key=>$val){                        if(isset($val['alias']) && in_array($tag,explode(',',$val['alias']))){                            $item  =   $val;                            break;                        }                    }                }else{                    $item  =   $this->tags[$tag];                }                            $attrs  = explode(',',$item['attr']);                if(isset($item['must'])){                    $must   =   explode(',',$item['must']);                }else{                    $must   =   array();                }                foreach($attrs as $name) {                    if( isset($array[$name])) {                        $array[$name] = str_replace('___','&',$array[$name]);                    }elseif(false !== array_search($name,$must)){                        E(L('_PARAM_ERROR_').':'.$name);                    }                }                return $array;            }        }else{            return array();// 返回 空字符串        }    }// 总结,反正没看明白了,不知道里面放的一些什么了    /**     * 解析条件表达式     * @access public     * @param string $condition 表达式标签内容     * @return array     */    public function parseCondition($condition) {        $condition = str_ireplace(array_keys($this->comparison),array_values($this->comparison),$condition);        $condition = preg_replace('/\$(\w+):(\w+)\s/is','$\\1->\\2 ',$condition);        switch(strtolower(C('TMPL_VAR_IDENTIFY'))) {            case 'array': // 识别为数组                $condition  =   preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1["\\2"] ',$condition);                break;            case 'obj':  // 识别为对象                $condition  =   preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1->\\2 ',$condition);                break;            default:  // 自动判断数组或对象 只支持二维                $condition  =   preg_replace('/\$(\w+)\.(\w+)\s/is','(is_array($\\1)?$\\1["\\2"]:$\\1->\\2) ',$condition);        }        if(false !== strpos($condition, '$Think'))            $condition      =   preg_replace_callback('/(\$Think.*?)\s/is', array($this, 'parseThinkVar'), $condition);                return $condition;    }// 条件的 组合    /**     * 自动识别构建变量     * @access public     * @param string $name 变量描述     * @return string     * 大哥啊,你也不给个例子呢     */    public function autoBuildVar($name) {        if('Think.' == substr($name,0,6)){            // 特殊变量            return $this->parseThinkVar($name);        }elseif(strpos($name,'.')) {            $vars = explode('.',$name);            $var  =  array_shift($vars);            switch(strtolower(C('TMPL_VAR_IDENTIFY'))) {                case 'array': // 识别为数组                    $name = '$'.$var;                    foreach ($vars as $key=>$val){                        if(0===strpos($val,'$')) {                            $name .= '["{'.$val.'}"]';                        }else{                            $name .= '["'.$val.'"]';                        }                    }                    break;                case 'obj':  // 识别为对象                    $name = '$'.$var;                    foreach ($vars as $key=>$val)                        $name .= '->'.$val;                    break;                default:  // 自动判断数组或对象 只支持二维                    $name = 'is_array($'.$var.')?$'.$var.'["'.$vars[0].'"]:$'.$var.'->'.$vars[0];            }        }elseif(strpos($name,':')){            // 额外的对象方式支持            $name   =   '$'.str_replace(':','->',$name);        }elseif(!defined($name)) {            $name = '$'.$name;        }        return $name;    } // 嗯嗯,想起来了,以前在 Tempalte 里面解析过呢    /**     * 用于标签属性里面的特殊模板变量解析     * 格式 以 Think. 打头的变量属于特殊模板变量     * @access public     * @param string $varStr  变量字符串     * @return string     * 这里的在 Template 里面是一样的     */    public function parseThinkVar($varStr){        if(is_array($varStr)){//用于正则替换回调函数            $varStr = $varStr[1];         }        $vars       = explode('.',$varStr);        $vars[1]    = strtoupper(trim($vars[1]));        $parseStr   = '';        if(count($vars)>=3){            $vars[2] = trim($vars[2]);            switch($vars[1]){                case 'SERVER':    $parseStr = '$_SERVER[\''.$vars[2].'\']';break;                case 'GET':         $parseStr = '$_GET[\''.$vars[2].'\']';break;                case 'POST':       $parseStr = '$_POST[\''.$vars[2].'\']';break;                case 'COOKIE':                    if(isset($vars[3])) {                        $parseStr = '$_COOKIE[\''.$vars[2].'\'][\''.$vars[3].'\']';                    }elseif(C('COOKIE_PREFIX')){                        $parseStr = '$_COOKIE[\''.C('COOKIE_PREFIX').$vars[2].'\']';                    }else{                        $parseStr = '$_COOKIE[\''.$vars[2].'\']';                    }                    break;                case 'SESSION':                    if(isset($vars[3])) {                        $parseStr = '$_SESSION[\''.$vars[2].'\'][\''.$vars[3].'\']';                    }elseif(C('SESSION_PREFIX')){                        $parseStr = '$_SESSION[\''.C('SESSION_PREFIX').'\'][\''.$vars[2].'\']';                    }else{                        $parseStr = '$_SESSION[\''.$vars[2].'\']';                    }                    break;                case 'ENV':         $parseStr = '$_ENV[\''.$vars[2].'\']';break;                case 'REQUEST':  $parseStr = '$_REQUEST[\''.$vars[2].'\']';break;                case 'CONST':     $parseStr = strtoupper($vars[2]);break;                case 'LANG':       $parseStr = 'L("'.$vars[2].'")';break;                case 'CONFIG':    $parseStr = 'C("'.$vars[2].'")';break;            }        }else if(count($vars)==2){            switch($vars[1]){                case 'NOW':       $parseStr = "date('Y-m-d g:i a',time())";break;                case 'VERSION':  $parseStr = 'THINK_VERSION';break;                case 'TEMPLATE':$parseStr = 'C("TEMPLATE_NAME")';break;                case 'LDELIM':    $parseStr = 'C("TMPL_L_DELIM")';break;                case 'RDELIM':    $parseStr = 'C("TMPL_R_DELIM")';break;                default:  if(defined($vars[1])) $parseStr = $vars[1];            }        }        return $parseStr;    }// 这里以前用过的    // 获取标签定义    public function getTags(){        return $this->tags;    }    // 无语返回}
0 0
原创粉丝点击