国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > PHP > 正文

thinkphp核心源碼注釋|Cx.class.php

2019-11-11 02:28:37
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
<?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/TagLib;use Think/Template/TagLib;/** * CX標(biāo)簽庫(kù)解析類 * 這里的 那個(gè) 繼承了 */class Cx extends TagLib { // 標(biāo)簽定義 PRotected $tags = array( // 標(biāo)簽定義: attr 屬性列表 close 是否閉合(0 或者1 默認(rèn)1) alias 標(biāo)簽別名 level 嵌套層次 'php' => array(), // 這里 什么都沒(méi)了 'volist' => array('attr'=>'name,id,offset,length,key,mod','level'=>3,'alias'=>'iterate'), // 里面 'foreach' => array('attr'=>'name,item,key','level'=>3), 'if' => array('attr'=>'condition','level'=>2), 'elseif' => array('attr'=>'condition','close'=>0), 'else' => array('attr'=>'','close'=>0), 'switch' => array('attr'=>'name','level'=>2), 'case' => array('attr'=>'value,break'), 'default' => array('attr'=>'','close'=>0), // 'compare' => array('attr'=>'name,value,type','level'=>3,'alias'=>'eq,equal,notequal,neq,gt,lt,egt,elt,heq,nheq'), 'range' => array('attr'=>'name,value,type','level'=>3,'alias'=>'in,notin,between,notbetween'), 'empty' => array('attr'=>'name','level'=>3), 'notempty' => array('attr'=>'name','level'=>3), 'present' => array('attr'=>'name','level'=>3), 'notpresent'=> array('attr'=>'name','level'=>3), 'defined' => array('attr'=>'name','level'=>3), 'notdefined'=> array('attr'=>'name','level'=>3), 'import' => array('attr'=>'file,href,type,value,basepath','close'=>0,'alias'=>'load,CSS,js'), 'assign' => array('attr'=>'name,value','close'=>0), 'define' => array('attr'=>'name,value','close'=>0), 'for' => array('attr'=>'start,end,name,comparison,step', 'level'=>3), );// 導(dǎo)入 全部支持的標(biāo)簽在這里了, // 分了: attr level close alias /** * php標(biāo)簽解析 * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string * 這里的 那個(gè) */ public function _php($tag,$content) { $parseStr = '<?php '.$content.' ?>'; return $parseStr; }// 這里的 那個(gè) php 標(biāo)簽 /** * volist標(biāo)簽解析 循環(huán)輸出數(shù)據(jù)集 * 格式: * <volist name="userList" id="user" empty="" > * {user.username} * {user.email} * </volist> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string|void */ public function _volist($tag,$content) { $name = $tag['name'];// 找到里面的那個(gè) $name $id = $tag['id']; // 獲取了 id $empty = isset($tag['empty'])?$tag['empty']:'';// 這里的 為空 $key = !empty($tag['key'])?$tag['key']:'i';// key i $mod = isset($tag['mod'])?$tag['mod']:'2';// mod // 允許使用函數(shù)設(shè)定數(shù)據(jù)集 <volist name=":fun('arg')" id="vo">{$vo.name}</volist> // 我去 這個(gè)還有這樣的 東西 $parseStr = '<?php '; // 保存開始了 if(0===strpos($name,':')) { $parseStr .= '$_result='.substr($name,1).';';// 如果是函數(shù)了 $name = '$_result';// name 里面的 那個(gè) 直接是函數(shù)開始了 }else{ $name = $this->autoBuildVar($name); // 解析 里面的標(biāo)簽,還是 那些通用的 標(biāo)簽了 }// 準(zhǔn)備參數(shù),準(zhǔn)備 變量 $parseStr .= 'if(is_array('.$name.')): $'.$key.' = 0;'; // 如果是數(shù)組呢 if(isset($tag['length']) && '' !=$tag['length'] ) { // 這里的 那個(gè) // array_slice(array,start,length,preserve) $parseStr .= ' $__LIST__ = array_slice('.$name.','.$tag['offset'].','.$tag['length'].',true);'; }elseif(isset($tag['offset']) && '' !=$tag['offset']){ $parseStr .= ' $__LIST__ = array_slice('.$name.','.$tag['offset'].',null,true);'; }else{ $parseStr .= ' $__LIST__ = '.$name.';'; }// 把這里的那個(gè) 真實(shí)的數(shù)據(jù)弄出來(lái) $parseStr .= 'if( count($__LIST__)==0 ) : echo "'.$empty.'" ;'; $parseStr .= 'else: '; $parseStr .= 'foreach($__LIST__ as $key=>$'.$id.'): '; $parseStr .= '$mod = ($'.$key.' % '.$mod.' );'; $parseStr .= '++$'.$key.';?>'; $parseStr .= $this->tpl->parse($content); $parseStr .= '<?php endforeach; endif; else: echo "'.$empty.'" ;endif; ?>'; if(!empty($parseStr)) { return $parseStr; } return ; }// 發(fā)現(xiàn)了 里面的 東西了 就是 volist 里面的 /** * foreach標(biāo)簽解析 循環(huán)輸出數(shù)據(jù)集 * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string|void */ public function _foreach($tag,$content) { $name = $tag['name']; $item = $tag['item']; $key = !empty($tag['key'])?$tag['key']:'key'; $name = $this->autoBuildVar($name); $parseStr = '<?php if(is_array('.$name.')): foreach('.$name.' as $'.$key.'=>$'.$item.'): ?>'; $parseStr .= $this->tpl->parse($content); $parseStr .= '<?php endforeach; endif; ?>'; if(!empty($parseStr)) { return $parseStr; } return ; }// 這里的 不錯(cuò)呢 /** * if標(biāo)簽解析 * 格式: * <if condition=" $a eq 1" > * <elseif condition="$a eq 2" /> * <else /> * </if> * 表達(dá)式支持 eq neq gt egt lt elt == > >= < <= or and || && * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _if($tag,$content) { $condition = $this->parseCondition($tag['condition']); $parseStr = '<?php if('.$condition.'): ?>'.$content.'<?php endif; ?>'; return $parseStr; }// 這里的 解析了 /** * else標(biāo)簽解析 * 格式:見(jiàn)if標(biāo)簽 * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _elseif($tag,$content) { $condition = $this->parseCondition($tag['condition']); $parseStr = '<?php elseif('.$condition.'): ?>'; return $parseStr; }// 解析了 else 里面的 東西 /** * else標(biāo)簽解析 * @access public * @param array $tag 標(biāo)簽屬性 * @return string */ public function _else($tag) { $parseStr = '<?php else: ?>'; return $parseStr; }// 這里的 那個(gè) /** * switch標(biāo)簽解析 * 格式: * <switch name="a.name" > * <case value="1" break="false">1</case> * <case value="2" >2</case> * <default />other * </switch> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _switch($tag,$content) { $name = $tag['name']; $varArray = explode('|',$name); $name = array_shift($varArray); $name = $this->autoBuildVar($name); if(count($varArray)>0) $name = $this->tpl->parseVarFunction($name,$varArray); $parseStr = '<?php switch('.$name.'): ?>'.$content.'<?php endswitch;?>'; return $parseStr; }// 這里的 東西 不錯(cuò)了 /** * case標(biāo)簽解析 需要配合switch才有效 * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _case($tag,$content) { $value = $tag['value']; if('$' == substr($value,0,1)) { $varArray = explode('|',$value); $value = array_shift($varArray); $value = $this->autoBuildVar(substr($value,1)); if(count($varArray)>0) $value = $this->tpl->parseVarFunction($value,$varArray); $value = 'case '.$value.': '; }elseif(strpos($value,'|')){ $values = explode('|',$value); $value = ''; foreach ($values as $val){ $value .= 'case "'.addslashes($val).'": '; } }else{ $value = 'case "'.$value.'": '; } $parseStr = '<?php '.$value.' ?>'.$content; $isBreak = isset($tag['break']) ? $tag['break'] : ''; if('' ==$isBreak || $isBreak) { $parseStr .= '<?php break;?>'; } return $parseStr; }// 這里的 代碼都是case 的轉(zhuǎn)碼了 /** * default標(biāo)簽解析 需要配合switch才有效 * 使用: <default />ddfdf * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _default($tag) { $parseStr = '<?php default: ?>'; return $parseStr; }// 這里 那個(gè) 配合 switch 里面的 /** * compare標(biāo)簽解析 * 用于值的比較 支持 eq neq gt lt egt elt heq nheq 默認(rèn)是eq * 格式: <compare name="" type="eq" value="" >content</compare> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _compare($tag,$content,$type='eq') { $name = $tag['name']; $value = $tag['value']; $type = isset($tag['type'])?$tag['type']:$type; $type = $this->parseCondition(' '.$type.' '); $varArray = explode('|',$name); $name = array_shift($varArray); $name = $this->autoBuildVar($name); if(count($varArray)>0) $name = $this->tpl->parseVarFunction($name,$varArray); if('$' == substr($value,0,1)) { $value = $this->autoBuildVar(substr($value,1)); }else { $value = '"'.$value.'"'; } $parseStr = '<?php if(('.$name.') '.$type.' '.$value.'): ?>'.$content.'<?php endif; ?>'; return $parseStr; }// 還不如把他解析了 里面 那個(gè) public function _eq($tag,$content) { return $this->_compare($tag,$content,'eq'); } public function _equal($tag,$content) { return $this->_compare($tag,$content,'eq'); } public function _neq($tag,$content) { return $this->_compare($tag,$content,'neq'); } public function _notequal($tag,$content) { return $this->_compare($tag,$content,'neq'); } public function _gt($tag,$content) { return $this->_compare($tag,$content,'gt'); } public function _lt($tag,$content) { return $this->_compare($tag,$content,'lt'); } public function _egt($tag,$content) { return $this->_compare($tag,$content,'egt'); } public function _elt($tag,$content) { return $this->_compare($tag,$content,'elt'); } public function _heq($tag,$content) { return $this->_compare($tag,$content,'heq'); } public function _nheq($tag,$content) { return $this->_compare($tag,$content,'nheq'); } // 這里的 特殊的 代碼 /** * range標(biāo)簽解析 * 如果某個(gè)變量存在于某個(gè)范圍 則輸出內(nèi)容 type= in 表示在范圍內(nèi) 否則表示在范圍外 * 格式: <range name="var|function" value="val" type='in|notin' >content</range> * example: <range name="a" value="1,2,3" type='in' >content</range> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @param string $type 比較類型 * @return string */ public function _range($tag,$content,$type='in') { $name = $tag['name']; $value = $tag['value']; $varArray = explode('|',$name); $name = array_shift($varArray); $name = $this->autoBuildVar($name); if(count($varArray)>0) $name = $this->tpl->parseVarFunction($name,$varArray); $type = isset($tag['type'])?$tag['type']:$type; if('$' == substr($value,0,1)) { $value = $this->autoBuildVar(substr($value,1)); $str = 'is_array('.$value.')?'.$value.':explode(/',/','.$value.')'; }else{ $value = '"'.$value.'"'; $str = 'explode(/',/','.$value.')'; } if($type=='between') { $parseStr = '<?php $_RANGE_VAR_='.$str.';if('.$name.'>= $_RANGE_VAR_[0] && '.$name.'<= $_RANGE_VAR_[1]):?>'.$content.'<?php endif; ?>'; }elseif($type=='notbetween'){ $parseStr = '<?php $_RANGE_VAR_='.$str.';if('.$name.'<$_RANGE_VAR_[0] || '.$name.'>$_RANGE_VAR_[1]):?>'.$content.'<?php endif; ?>'; }else{ $fun = ($type == 'in')? 'in_array' : '!in_array'; $parseStr = '<?php if('.$fun.'(('.$name.'), '.$str.')): ?>'.$content.'<?php endif; ?>'; } return $parseStr; } // 這種里面的代碼 是否都可以替換成為 那個(gè) // range標(biāo)簽的別名 用于in判斷 public function _in($tag,$content) { return $this->_range($tag,$content,'in'); } // range標(biāo)簽的別名 用于notin判斷 public function _notin($tag,$content) { return $this->_range($tag,$content,'notin'); } public function _between($tag,$content){ return $this->_range($tag,$content,'between'); } public function _notbetween($tag,$content){ return $this->_range($tag,$content,'notbetween'); } // 別名 不錯(cuò)啊 /** * present標(biāo)簽解析 * 如果某個(gè)變量已經(jīng)設(shè)置 則輸出內(nèi)容 * 格式: <present name="" >content</present> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _present($tag,$content) { $name = $tag['name']; $name = $this->autoBuildVar($name); $parseStr = '<?php if(isset('.$name.')): ?>'.$content.'<?php endif; ?>'; return $parseStr; }// 這里的那個(gè) 是 /** * notpresent標(biāo)簽解析 * 如果某個(gè)變量沒(méi)有設(shè)置,則輸出內(nèi)容 * 格式: <notpresent name="" >content</notpresent> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _notpresent($tag,$content) { $name = $tag['name']; $name = $this->autoBuildVar($name); $parseStr = '<?php if(!isset('.$name.')): ?>'.$content.'<?php endif; ?>'; return $parseStr; }// 這里的標(biāo)簽了 /** * empty標(biāo)簽解析 * 如果某個(gè)變量為empty 則輸出內(nèi)容 * 格式: <empty name="" >content</empty> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _empty($tag,$content) { $name = $tag['name']; $name = $this->autoBuildVar($name); $parseStr = '<?php if(empty('.$name.')): ?>'.$content.'<?php endif; ?>'; return $parseStr; } public function _notempty($tag,$content) { $name = $tag['name']; $name = $this->autoBuildVar($name); $parseStr = '<?php if(!empty('.$name.')): ?>'.$content.'<?php endif; ?>'; return $parseStr; }// 這里的那個(gè) /** * 判斷是否已經(jīng)定義了該常量 * <defined name='TXT'>已定義</defined> * @param <type> $attr * @param <type> $content * @return string */ public function _defined($tag,$content) { $name = $tag['name']; $parseStr = '<?php if(defined("'.$name.'")): ?>'.$content.'<?php endif; ?>'; return $parseStr; }// 都是轉(zhuǎn)成 if public function _notdefined($tag,$content) { $name = $tag['name']; $parseStr = '<?php if(!defined("'.$name.'")): ?>'.$content.'<?php endif; ?>'; return $parseStr; }// 都是 轉(zhuǎn)成 /** * import 標(biāo)簽解析 <import file="Js.Base" /> * <import file="Css.Base" type="css" /> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @param boolean $isFile 是否文件方式 * @param string $type 類型 * @return string */ public function _import($tag,$content,$isFile=false,$type='') { $file = isset($tag['file'])?$tag['file']:$tag['href']; $parseStr = ''; $endStr = ''; // 判斷是否存在加載條件 允許使用函數(shù)判斷(默認(rèn)為isset) if (isset($tag['value'])) { $varArray = explode('|',$tag['value']); $name = array_shift($varArray); $name = $this->autoBuildVar($name); if (!empty($varArray)) $name = $this->tpl->parseVarFunction($name,$varArray); else $name = 'isset('.$name.')'; $parseStr .= '<?php if('.$name.'): ?>'; $endStr = '<?php endif; ?>'; } if($isFile) { // 根據(jù)文件名后綴自動(dòng)識(shí)別 $type = $type?$type:(!empty($tag['type'])?strtolower($tag['type']):null); // 文件方式導(dǎo)入 $array = explode(',',$file); foreach ($array as $val){ if (!$type || isset($reset)) { $type = $reset = strtolower(substr(strrchr($val, '.'),1)); } switch($type) { case 'js': $parseStr .= '<script type="text/javascript" src="'.$val.'"></script>'; break; case 'css': $parseStr .= '<link rel="stylesheet" type="text/css" href="'.$val.'" />'; break; case 'php': $parseStr .= '<?php require_cache("'.$val.'"); ?>'; break; } } }else{ // 命名空間導(dǎo)入模式 默認(rèn)是js $type = $type?$type:(!empty($tag['type'])?strtolower($tag['type']):'js'); $basepath = !empty($tag['basepath'])?$tag['basepath']:__ROOT__.'/Public'; // 命名空間方式導(dǎo)入外部文件 $array = explode(',',$file); foreach ($array as $val){ if(strpos ($val, '?')) { list($val,$version) = explode('?',$val); } else { $version = ''; } switch($type) { case 'js': $parseStr .= '<script type="text/Javascript" src="'.$basepath.'/'.str_replace(array('.','#'), array('/','.'),$val).'.js'.($version?'?'.$version:'').'"></script>'; break; case 'css': $parseStr .= '<link rel="stylesheet" type="text/css" href="'.$basepath.'/'.str_replace(array('.','#'), array('/','.'),$val).'.css'.($version?'?'.$version:'').'" />'; break; case 'php': $parseStr .= '<?php import("'.$val.'"); ?>'; break; } } } return $parseStr.$endStr; }// 這里 是可以 進(jìn)入那個(gè) 包含 什么各種各樣的文件 type 里面的產(chǎn)品了 // import別名 采用文件方式加載(要使用命名空間必須用import) 例如 <load file="__PUBLIC__/Js/Base.js" /> public function _load($tag,$content) { return $this->_import($tag,$content,true); } // import別名使用 導(dǎo)入css文件 <css file="__PUBLIC__/Css/Base.css" /> public function _css($tag,$content) { return $this->_import($tag,$content,true,'css'); } // import別名使用 導(dǎo)入js文件 <js file="__PUBLIC__/Js/Base.js" /> public function _js($tag,$content) { return $this->_import($tag,$content,true,'js'); } /** * assign標(biāo)簽解析 * 在模板中給某個(gè)變量賦值 支持變量賦值 * 格式: <assign name="" value="" /> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _assign($tag,$content) { $name = $this->autoBuildVar($tag['name']); if('$'==substr($tag['value'],0,1)) { $value = $this->autoBuildVar(substr($tag['value'],1)); }else{ $value = '/''.$tag['value']. '/''; } $parseStr = '<?php '.$name.' = '.$value.'; ?>'; return $parseStr; }// assign 就是復(fù)制過(guò)來(lái)了,找到原型了 /** * define標(biāo)簽解析 * 在模板中定義常量 支持變量賦值 * 格式: <define name="" value="" /> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _define($tag,$content) { $name = '/''.$tag['name']. '/''; if('$'==substr($tag['value'],0,1)) { $value = $this->autoBuildVar(substr($tag['value'],1)); }else{ $value = '/''.$tag['value']. '/''; } $parseStr = '<?php define('.$name.', '.$value.'); ?>'; return $parseStr; }// 找到了 define 里面的定義了 /** * for標(biāo)簽解析 * 格式: <for start="" end="" comparison="" step="" name="" /> * @access public * @param array $tag 標(biāo)簽屬性 * @param string $content 標(biāo)簽內(nèi)容 * @return string */ public function _for($tag, $content){ //設(shè)置默認(rèn)值 $start = 0; $end = 0; $step = 1; $comparison = 'lt'; $name = 'i'; $rand = rand(); //添加隨機(jī)數(shù),防止嵌套變量沖突 //獲取屬性 foreach ($tag as $key => $value){ $value = trim($value); if(':'==substr($value,0,1)) $value = substr($value,1); elseif('$'==substr($value,0,1)) $value = $this->autoBuildVar(substr($value,1)); switch ($key){ case 'start': $start = $value; break; case 'end' : $end = $value; break; case 'step': $step = $value; break; case 'comparison': $comparison = $value; break; case 'name': $name = $value; break; } } $parseStr = '<?php $__FOR_START_'.$rand.'__='.$start.';$__FOR_END_'.$rand.'__='.$end.';'; $parseStr .= 'for($'.$name.'=$__FOR_START_'.$rand.'__;'.$this->parseCondition('$'.$name.' '.$comparison.' $__FOR_END_'.$rand.'__').';$'.$name.'+='.$step.'){ ?>'; $parseStr .= $content; $parseStr .= '<?php } ?>'; return $parseStr; }// for 標(biāo)簽專用}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乐清市| 元谋县| 黑水县| 遵义县| 民丰县| 三台县| 青岛市| 乌拉特中旗| 象山县| 建水县| 平阳县| 开化县| 珠海市| 革吉县| 河东区| 郸城县| 惠东县| 阜宁县| 江阴市| 山西省| 淮滨县| 五大连池市| 灌云县| 金阳县| 泰来县| 改则县| 太仆寺旗| 永吉县| 永善县| 侯马市| 平果县| 玉树县| 永春县| 新津县| 如东县| 景宁| 永川市| 赣州市| 深泽县| 连城县| 普安县|