[李景山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
- thinkphp核心源码注释|Taglib.class.php
- [李景山php]thinkphp核心源码注释|Taglib.class.php
- [李景山php]thinkphp核心源码注释|View.class.php
- [李景山php]thinkphp核心源码注释|Think.class.php
- [李景山php]thinkphp核心源码注释|Template.class.php
- [李景山php]thinkphp核心源码注释|Storage.class.php
- [李景山php]thinkphp核心源码注释|Route.class.php
- [李景山php]thinkphp核心源码注释|Model.class.php
- [李景山php]thinkphp核心源码注释|Log.class.php
- [李景山php]thinkphp核心源码注释|Hook.class.php
- [李景山php]thinkphp核心源码注释|DB.class.php
- [李景山php]thinkphp核心源码注释|Controller.class.php
- [李景山php]thinkphp核心源码注释|Cache.class.php
- [李景山php]thinkphp核心源码注释|Build.class.php
- [李景山php]thinkphp核心源码注释|App.class.php
- [李景山php]thinkphp核心源码注释|Disaptcher.class.php
- [李景山php]thinkphp核心源码注释|Cx.class.php
- [李景山php]thinkphp核心源码注释|Html.class.php
- C++引用
- 深度学习-LeCun、Bengio和Hinton的联合综述
- 学习 图形着色器-理论与实践 graphic shaders - glman
- JAVA多态性实现机制
- [期望DP] UNR #1 合唱队形
- [李景山php]thinkphp核心源码注释|Taglib.class.php
- SpringObjectFactory 空指针问题
- UVA10037
- Java开发之Spring MVC(二)
- JavaScript中的splice方法
- java操作mongodb数据库
- orbslam作者的ppt
- [李景山php]thinkphp核心源码注释|Cx.class.php
- 手把手教你做视频播放器(五)-视频列表的横屏