php taglib.php,thinkphp核心源码注释|Taglib.class.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

// +----------------------------------------------------------------------

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 = '';

$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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值