首页 > 语言 > PHP > 正文

thinkphp核心源码注释|Taglib.class.php

2024-05-05 00:04:38
字体:
来源:转载
供稿:网友
thinkphp核心源码注释|Taglib.class.php
  1. <?php 
  2. // +---------------------------------------------------------------------- 
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] 
  4. // +---------------------------------------------------------------------- 
  5. // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. 
  6. // +---------------------------------------------------------------------- 
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) 
  8. // +---------------------------------------------------------------------- 
  9. // | Author: liu21st <liu21st@gmail.com> 
  10. // +---------------------------------------------------------------------- 
  11. namespace Think/Template; 
  12. /** 
  13.  * ThinkPHP标签库TagLib解析基类 
  14.  * 这个基础类,好像是跟那个差不多呢 
  15.  */ 
  16. class TagLib { 
  17.   
  18.     /** 
  19.      * 标签库定义XML文件 
  20.      * @var string 
  21.      * @access protected 
  22.      */ 
  23.     protected $xml      = ''// 保存的文件 
  24.     protected $tags     = array();// 标签定义 
  25.     /** 
  26.      * 标签库名称 
  27.      * @var string 
  28.      * @access protected 
  29.      */ 
  30.     protected $tagLib   ='';// 标签库名称 
  31.   
  32.     /** 
  33.      * 标签库标签列表 
  34.      * @var string 
  35.      * @access protected 
  36.      */ 
  37.     protected $tagList  = array(); 
  38.   
  39.     /** 
  40.      * 标签库分析数组 
  41.      * @var string 
  42.      * @access protected 
  43.      */ 
  44.     protected $parse    = array(); 
  45.   
  46.     /** 
  47.      * 标签库是否有效 
  48.      * @var string 
  49.      * @access protected 
  50.      */ 
  51.     protected $valid    = false; 
  52.   
  53.     /** 
  54.      * 当前模板对象 
  55.      * @var object 
  56.      * @access protected 
  57.      */ 
  58.     protected $tpl
  59.   
  60.     protected $comparison = array(' nheq '=>' !== ',' heq '=>' === ',' neq '=>' != ',' eq '=>' == ',' egt '=>' >= ',' gt '=>' > ',' elt '=>' <= ',' lt '=>' < '); 
  61.     // 对标签的一定 处理,标签 很重要 
  62.     /** 
  63.      * 架构函数 
  64.      * @access public 
  65.      */ 
  66.     public function __construct() { 
  67.         $this->tagLib  = strtolower(substr(get_class($this),6));// 如果这样写的话,对于基类 一点意义也没有呢 
  68.         // substr get_class($this) TagLib 
  69.         $this->tpl     = /Think/Think::instance('Think//Template'); // 实例化模版了 
  70.     }// 初始化了 这里的  taglib 其实是没什么的了 , 
  71.     // tpl 就是个 new 一下 Think/Template 了 
  72.   
  73.     /** 
  74.      * TagLib标签属性分析 返回标签属性数组 
  75.      * @access public 
  76.      * @param string $tagStr 标签内容 
  77.      * @return array 
  78.      */ 
  79.     public function parseXmlAttr($attr,$tag) { 
  80.         //XML解析安全过滤 
  81.         $attr   =   str_replace('&','___'$attr);// 你这个替换是弄啥赖,哈哈 
  82.         $xml    =   '<tpl><tag '.$attr.' /></tpl>'
  83.         $xml    =   simplexml_load_string($xml); // 返回类 SimpleXMLElement 的一个对象,该对象的属性包含 XML 文档中的数据。如果失败,则返回 false。 
  84.         if(!$xml) { 
  85.             E(L('_XML_TAG_ERROR_').' : '.$attr); 
  86.         }// 如果没有获取到 对应 
  87.         $xml    =   (array)($xml->tag->attributes());// 获取到对应的属性数组 
  88.         if(isset($xml['@attributes'])){ 
  89.             $array  =   array_change_key_case($xml['@attributes']); 
  90.             if($array) { // 如果已经 包含 了数据 
  91.                 $tag    =   strtolower($tag);// 获取了 这里的 小写 
  92.                 if(!isset($this->tags[$tag])){ 
  93.                     // 检测是否存在别名定义 
  94.                     foreach($this->tags as $key=>$val){ 
  95.                         if(isset($val['alias']) && in_array($tag,explode(',',$val['alias']))){ 
  96.                             $item  =   $val
  97.                             break
  98.                         } 
  99.                     } 
  100.                 }else
  101.                     $item  =   $this->tags[$tag]; 
  102.                 }             
  103.                 $attrs  = explode(',',$item['attr']); 
  104.                 if(isset($item['must'])){ 
  105.                     $must   =   explode(',',$item['must']); 
  106.                 }else
  107.                     $must   =   array(); 
  108.                 } 
  109.                 foreach($attrs as $name) { 
  110.                     if( isset($array[$name])) { 
  111.                         $array[$name] = str_replace('___','&',$array[$name]); 
  112.                     }elseif(false !== array_search($name,$must)){ 
  113.                         E(L('_PARAM_ERROR_').':'.$name); 
  114.                     } 
  115.                 } 
  116.                 return $array
  117.             } 
  118.         }else
  119.             return array();// 返回 空字符串 
  120.         } 
  121.     }// 总结,反正没看明白了,不知道里面放的一些什么了 
  122.   
  123.     /** 
  124.      * 解析条件表达式 
  125.      * @access public 
  126.      * @param string $condition 表达式标签内容 
  127.      * @return array 
  128.      */ 
  129.     public function parseCondition($condition) { 
  130.         $condition = str_ireplace(array_keys($this->comparison),array_values($this->comparison),$condition); 
  131.         $condition = preg_replace('//$(/w+):(/w+)/s/is','$//1->//2 ',$condition); 
  132.         switch(strtolower(C('TMPL_VAR_IDENTIFY'))) { 
  133.             case 'array'// 识别为数组 
  134.                 $condition  =   preg_replace('//$(/w+)/.(/w+)/s/is','$//1["//2"] ',$condition); 
  135.                 break
  136.             case 'obj':  // 识别为对象 
  137.                 $condition  =   preg_replace('//$(/w+)/.(/w+)/s/is','$//1->//2 ',$condition); 
  138.                 break
  139.             default:  // 自动判断数组或对象 只支持二维 
  140.                 $condition  =   preg_replace('//$(/w+)/.(/w+)/s/is','(is_array($//1)?$//1["//2"]:$//1->//2) ',$condition); 
  141.         } 
  142.         if(false !== strpos($condition'$Think')) 
  143.             $condition      =   preg_replace_callback('/(/$Think.*?)/s/is'array($this'parseThinkVar'), $condition);         
  144.         return $condition
  145.     }// 条件的 组合 
  146.   
  147.     /** 
  148.      * 自动识别构建变量 
  149.      * @access public 
  150.      * @param string $name 变量描述 
  151.      * @return string 
  152.      * 大哥啊,你也不给个例子呢 
  153.      */ 
  154.     public function autoBuildVar($name) { 
  155.         if('Think.' == substr($name,0,6)){ 
  156.             // 特殊变量 
  157.             return $this->parseThinkVar($name); 
  158.         }elseif(strpos($name,'.')) { 
  159.             $vars = explode('.',$name); 
  160.             $var  =  array_shift($vars); 
  161.             switch(strtolower(C('TMPL_VAR_IDENTIFY'))) { 
  162.                 case 'array'// 识别为数组 
  163.                     $name = '$'.$var
  164.                     foreach ($vars as $key=>$val){ 
  165.                         if(0===strpos($val,'$')) { 
  166.                             $name .= '["{'.$val.'}"]'
  167.                         }else
  168.                             $name .= '["'.$val.'"]'
  169.                         } 
  170.                     } 
  171.                     break
  172.                 case 'obj':  // 识别为对象 
  173.                     $name = '$'.$var
  174.                     foreach ($vars as $key=>$val
  175.                         $name .= '->'.$val
  176.                     break
  177.                 default:  // 自动判断数组或对象 只支持二维 
  178.                     $name = 'is_array($'.$var.')?$'.$var.'["'.$vars[0].'"]:$'.$var.'->'.$vars[0]; 
  179.             } 
  180.         }elseif(strpos($name,':')){ 
  181.             // 额外的对象方式支持 
  182.             $name   =   '$'.str_replace(':','->',$name); 
  183.         }elseif(!defined($name)) { 
  184.             $name = '$'.$name
  185.         } 
  186.         return $name
  187.     } // 嗯嗯,想起来了,以前在 Tempalte 里面解析过呢 
  188.   
  189.     /** 
  190.      * 用于标签属性里面的特殊模板变量解析 
  191.      * 格式 以 Think. 打头的变量属于特殊模板变量 
  192.      * @access public 
  193.      * @param string $varStr  变量字符串 
  194.      * @return string 
  195.      * 这里的在 Template 里面是一样的 
  196.      */ 
  197.     public function parseThinkVar($varStr){ 
  198.         if(is_array($varStr)){//用于正则替换回调函数 
  199.             $varStr = $varStr[1];  
  200.         } 
  201.         $vars       = explode('.',$varStr); 
  202.         $vars[1]    = strtoupper(trim($vars[1])); 
  203.         $parseStr   = ''
  204.         if(count($vars)>=3){ 
  205.             $vars[2] = trim($vars[2]); 
  206.             switch($vars[1]){ 
  207.                 case 'SERVER':    $parseStr = '$_SERVER[/''.$vars[2].'/']';break
  208.                 case 'GET':         $parseStr = '$_GET[/''.$vars[2].'/']';break
  209.                 case 'POST':       $parseStr = '$_POST[/''.$vars[2].'/']';break
  210.                 case 'COOKIE'
  211.                     if(isset($vars[3])) { 
  212.                         $parseStr = '$_COOKIE[/''.$vars[2].'/'][/''.$vars[3].'/']'
  213.                     }elseif(C('COOKIE_PREFIX')){ 
  214.                         $parseStr = '$_COOKIE[/''.C('COOKIE_PREFIX').$vars[2].'/']'
  215.                     }else
  216.                         $parseStr = '$_COOKIE[/''.$vars[2].'/']'
  217.                     } 
  218.                     break
  219.                 case 'SESSION'
  220.                     if(isset($vars[3])) { 
  221.                         $parseStr = '$_SESSION[/''.$vars[2].'/'][/''.$vars[3].'/']'
  222.                     }elseif(C('SESSION_PREFIX')){ 
  223.                         $parseStr = '$_SESSION[/''.C('SESSION_PREFIX').'/'][/''.$vars[2].'/']'
  224.                     }else
  225.                         $parseStr = '$_SESSION[/''.$vars[2].'/']'
  226.                     } 
  227.                     break
  228.                 case 'ENV':         $parseStr = '$_ENV[/''.$vars[2].'/']';break
  229.                 case 'REQUEST':  $parseStr = '$_REQUEST[/''.$vars[2].'/']';break
  230.                 case 'CONST':     $parseStr = strtoupper($vars[2]);break
  231.                 case 'LANG':       $parseStr = 'L("'.$vars[2].'")';break
  232.                 case 'CONFIG':    $parseStr = 'C("'.$vars[2].'")';break
  233.             } 
  234.         }else if(count($vars)==2){ 
  235.             switch($vars[1]){ 
  236.                 case 'NOW':       $parseStr = "date('Y-m-d g:i a',time())";break
  237.                 case 'VERSION':  $parseStr = 'THINK_VERSION';break
  238.                 case 'TEMPLATE':$parseStr = 'C("TEMPLATE_NAME")';break
  239.                 case 'LDELIM':    $parseStr = 'C("TMPL_L_DELIM")';break
  240.                 case 'RDELIM':    $parseStr = 'C("TMPL_R_DELIM")';break
  241.                 default:  if(defined($vars[1])) $parseStr = $vars[1]; 
  242.             } 
  243.         } 
  244.         return $parseStr
  245.     }// 这里以前用过的 
  246.   
  247.     // 获取标签定义 
  248.     public function getTags(){ 
  249.         return $this->tags; 
  250.     } 
  251.     // 无语返回 


注:相关教程知识阅读请移步到PHP教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选