}
/**
-
获取模版文件 格式 资源://模块@主题/控制器/操作
-
@param string $template 模版资源地址
-
@param string $layer 视图层(目录)名称
-
@return string
*/
function T( t e m p l a t e = ′ ′ , template='', template=′′,layer=’’){// 解析模版资源地址
if(false === strpos($template,’?/’)){
t e m p l a t e = ′ h t t p : / / ′ . s t r r e p l a c e ( ′ : ′ , ′ / ′ , template = 'http://'.str_replace(':', '/', template=′http://′.strreplace(′:′,′/′,template);
}
i n f o = p a r s e u r l ( info = parse_url( info=parseurl(template);
$file = i n f o [ ′ h o s t ′ ] . ( i s s e t ( info['host'].(isset( info[′host′].(isset(info[‘path’])?$info[‘path’]:’’);
m o d u l e = i s s e t ( module = isset( module=isset(info[‘user’])?$info[‘user’].’/’:MODULE_NAME.’/’;
$extend = $info[‘scheme’];
$layer = l a y e r ? layer? layer?layer:C(‘DEFAULT_V_LAYER’);// 获取当前主题的模版路径
a u t o = C ( ′ A U T O L O A D N A M E S P A C E ′ ) ; i f ( auto = C('AUTOLOAD_NAMESPACE'); if( auto=C(′AUTOLOADNAMESPACE′);if(auto && isset( a u t o [ auto[ auto[extend])){ // 扩展资源
$baseUrl = a u t o [ auto[ auto[extend]. m o d u l e . module. module.layer.’/’;
}elseif(C(‘VIEW_PATH’)){
// 改变模块视图目录
$baseUrl = C(‘VIEW_PATH’);
}elseif(defined(‘TMPL_PATH’)){
// 指定全局视图目录
b a s e U r l = T M P L P A T H . baseUrl = TMPL_PATH. baseUrl=TMPLPATH.module;
}else{
b a s e U r l = A P P P A T H . baseUrl = APP_PATH. baseUrl=APPPATH.module.$layer.’/’;
}// 获取主题
t h e m e = s u b s t r c o u n t ( theme = substr_count( theme=substrcount(file,’/’)<2 ? C(‘DEFAULT_THEME’) : ‘’;// 分析模板文件规则
$depr = C(‘TMPL_FILE_DEPR’);
if(’’ == $file) {
// 如果模板文件名为空 按照默认规则定位
$file = CONTROLLER_NAME . KaTeX parse error: Expected 'EOF', got '}' at position 22: … ACTION_NAME; }̲elseif(false ==…file, ‘/’)){
$file = CONTROLLER_NAME . $depr . $file;
}elseif(’/’ != $depr){
f i l e = s u b s t r c o u n t ( file = substr_count( file=substrcount(file,’/’)>1 ? substr_replace( f i l e , file, file,depr,strrpos($file,’/’),1) : str_replace(’/’, $depr, $file);
}
return b a s e U r l . ( baseUrl.( baseUrl.(theme? t h e m e . ′ / ′ : ′ ′ ) . theme.'/':''). theme.′/′:′′).file.C(‘TMPL_TEMPLATE_SUFFIX’);
}
/**
-
获取输入参数 支持过滤和默认值
-
使用方法:
-
-
I(‘id’,0); 获取id参数 自动判断get或者post
-
I(‘post.name’,’’,‘htmlspecialchars’); 获取$_POST[‘name’]
-
I(‘get.’); 获取$_GET
-
@param string $name 变量的名称 支持指定类型
-
@param mixed $default 不存在的时候默认值
-
@param mixed $filter 参数过滤方法
-
@param mixed $datas 要获取的额外数据源
-
@return mixed
*/
function I( n a m e , name, name,default=’’, f i l t e r = n u l l , filter=null, filter=null,datas=null) {
static P U T = n u l l ; i f ( s t r p o s ( _PUT = null; if(strpos( PUT=null;if(strpos(name,’/’)){ // 指定修饰符
list( n a m e , name, name,type) = explode(’/’,$name,2);
}elseif(C(‘VAR_AUTO_STRING’)){ // 默认强制转换为字符串
KaTeX parse error: Expected 'EOF', got '}' at position 18: …pe = 's'; }̲ if(strpos(name,’.’)) { // 指定参数来源
list( m e t h o d , method, method,name) = explode(’.’,$name,2);
}else{ // 默认为自动判断
KaTeX parse error: Expected 'EOF', got '}' at position 22: … = 'param'; }̲ switch(strtol…method)) {
case ‘get’ :
$input =& $_GET;
break;
case ‘post’ :
$input =& P O S T ; b r e a k ; c a s e ′ p u t ′ : i f ( i s n u l l ( _POST; break; case 'put' : if(is_null( POST;break;case′put′:if(isnull(_PUT)){
parse_str(file_get_contents(‘php://input’), $_PUT);
}
$input = P U T ; b r e a k ; c a s e ′ p a r a m ′ : s w i t c h ( _PUT; break; case 'param' : switch( PUT;break;case′param′:switch(_SERVER[‘REQUEST_METHOD’]) {
case ‘POST’:
$input = P O S T ; b r e a k ; c a s e ′ P U T ′ : i f ( i s n u l l ( _POST; break; case 'PUT': if(is_null( POST;break;case′PUT′:if(isnull(_PUT)){
parse_str(file_get_contents(‘php://input’), $_PUT);
}
$input = $_PUT;
break;
default:
$input = $_GET;
}
break;
case ‘path’ :
i n p u t = a r r a y ( ) ; i f ( ! e m p t y ( input = array(); if(!empty( input=array();if(!empty(_SERVER[‘PATH_INFO’])){
$depr = C(‘URL_PATHINFO_DEPR’);
i n p u t = e x p l o d e ( input = explode( input=explode(depr,trim( S E R V E R [ ′ P A T H I N F O ′ ] , _SERVER['PATH_INFO'], SERVER[′PATHINFO′],depr));
}
break;
case ‘request’ :
$input =& $_REQUEST;
break;
case ‘session’ :
$input =& $_SESSION;
break;
case ‘cookie’ :
$input =& $_COOKIE;
break;
case ‘server’ :
$input =& $_SERVER;
break;
case ‘globals’ :
$input =& $GLOBALS;
break;
case ‘data’ :
$input =& KaTeX parse error: Expected 'EOF', got '}' at position 64: … return null; }̲ if(''==name) { // 获取全部变量
$data = $input;
f i l t e r s = i s s e t ( filters = isset( filters=isset(filter)? f i l t e r : C ( ′ D E F A U L T F I L T E R ′ ) ; i f ( filter:C('DEFAULT_FILTER'); if( filter:C(′DEFAULTFILTER′);if(filters) {
if(is_string($filters)){
f i l t e r s = e x p l o d e ( ′ , ′ , filters = explode(',', filters=explode(′,′,filters);
}
foreach($filters as $filter){
d a t a = a r r a y m a p r e c u r s i v e ( data = array_map_recursive( data=arraymaprecursive(filter,KaTeX parse error: Expected 'EOF', got '}' at position 25: … 参数过滤 }̲ } }elsei…input[$name])) { // 取值操作
$data = i n p u t [ input[ input[name];
f i l t e r s = i s s e t ( filters = isset( filters=isset(filter)? f i l t e r : C ( ′ D E F A U L T F I L T E R ′ ) ; i f ( filter:C('DEFAULT_FILTER'); if( filter:C(′DEFAULTFILTER′);if(filters) {
if(is_string(KaTeX parse error: Expected '}', got 'EOF' at end of input: …f(0 === strpos(filters,’/’)){
if(1 !== preg_match( f i l t e r s , ( s t r i n g ) filters,(string) filters,(string)data)){
// 支持正则验证
return isset($default) ? $default : null;
}
}else{
f i l t e r s = e x p l o d e ( ′ , ′ , filters = explode(',', filters=explode(′,′,filters);
}
}elseif(is_int($filters)){
f i l t e r s = a r r a y ( filters = array( filters=array(filters);
}if(is_array($filters)){ foreach($filters as $filter){ if(function_exists($filter)) { $data = is_array($data) ? array_map_recursive($filter,$data) : $filter($data); // 参数过滤 }else{ $data = filter_var($data,is_int($filter) ? $filter : filter_id($filter)); if(false === $data) { return isset($default) ? $default : null; } } } } } if(!empty($type)){ switch(strtolower($type)){ case 'a': // 数组 $data = (array)$data; break; case 'd': // 数字 $data = (int)$data; break; case 'f': // 浮点 $data = (float)$data; break; case 'b': // 布尔 $data = (boolean)$data; break; case 's': // 字符串 default: $data = (string)$data; } }
}else{ // 变量默认值
d a t a = i s s e t ( data = isset( data=isset(default)?KaTeX parse error: Expected 'EOF', got '}' at position 16: default:null; }̲ is_array(data) && array_walk_recursive($data,‘think_filter’);
return $data;
}
function array_map_recursive($filter, $data) {
r
e
s
u
l
t
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
result = array(); foreach (
result=array();foreach(data as $key => $val) {
r
e
s
u
l
t
[
result[
result[key] = is_array(
v
a
l
)
?
a
r
r
a
y
m
a
p
r
e
c
u
r
s
i
v
e
(
val) ? array_map_recursive(
val)?arraymaprecursive(filter,
v
a
l
)
:
c
a
l
l
u
s
e
r
f
u
n
c
(
val) : call_user_func(
val):calluserfunc(filter, $val);
}
return $result;
}
/**
- 设置和获取统计数据
- 使用方法:
-
- N(‘db’,1); // 记录数据库操作次数
- N(‘read’,1); // 记录读取次数
- echo N(‘db’); // 获取当前页面数据库的所有操作次数
- echo N(‘read’); // 获取当前页面读取次数
- @param string $key 标识位置
- @param integer $step 步进值
- @param boolean $save 是否保存结果
- @return mixed
*/
function N($key, s t e p = 0 , step=0, step=0,save=false) {
static n u m = a r r a y ( ) ; i f ( ! i s s e t ( _num = array(); if (!isset( num=array();if(!isset(_num[$key])) {
n u m [ _num[ num[key] = (false !== KaTeX parse error: Expected group after '_' at position 12: save)? S('N_̲'.key) : 0;
}
if (empty($step)){
return n u m [ _num[ num[key];
}else{
n u m [ _num[ num[key] = n u m [ _num[ num[key] + (int)$step;
}
if(false !== KaTeX parse error: Expected group after '_' at position 25: … 保存结果 S('N_̲'.key, n u m [ _num[ num[key],$save);
}
return null;
}
/**
- 字符串命名风格转换
- type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
- @param string $name 字符串
- @param integer $type 转换类型
- @return string
*/
function parse_name($name, KaTeX parse error: Expected '}', got 'EOF' at end of input: type=0) { if (type) {
return ucfirst(preg_replace_callback(’/([a-zA-Z])/’, function(KaTeX parse error: Expected '}', got 'EOF' at end of input: …urn strtoupper(match[1]);}, $name));
} else {
return strtolower(trim(preg_replace("/[A-Z]/", "\0", $name), “_”));
}
}
/**
- 优化的require_once
- @param string $filename 文件地址
- @return boolean
*/
function require_cache($filename) {
static i m p o r t F i l e s = a r r a y ( ) ; i f ( ! i s s e t ( _importFiles = array(); if (!isset( importFiles=array();if(!isset(_importFiles[KaTeX parse error: Expected '}', got 'EOF' at end of input: …le_exists_case(filename)) {
require $filename;
i m p o r t F i l e s [ _importFiles[ importFiles[filename] = true;
} else {
i m p o r t F i l e s [ _importFiles[ importFiles[filename] = false;
}
}
return i m p o r t F i l e s [ _importFiles[ importFiles[filename];
}
/**
- 区分大小写的文件存在判断
- @param string $filename 文件地址
- @return boolean
*/
function file_exists_case(KaTeX parse error: Expected '}', got 'EOF' at end of input: …{ if (is_file(filename)) {
if (IS_WIN && APP_DEBUG) {
if (basename(realpath( f i l e n a m e ) ) ! = b a s e n a m e ( filename)) != basename( filename))!=basename(filename))
return false;
}
return true;
}
return false;
}
/**
- 导入所需的类库 同java的Import 本函数有缓存功能
- @param string $class 类库命名空间字符串
- @param string $baseUrl 起始路径
- @param string $ext 导入的文件扩展名
- @return boolean
*/
function import($class, $baseUrl = ‘’, $ext=EXT) {
static $_file = array();
$class = str_replace(array(’.’, ‘#’), array(’/’, ‘.’), c l a s s ) ; i f ( i s s e t ( class); if (isset( class);if(isset(_file[$class . $baseUrl]))
return true;
else
f i l e [ _file[ file[class . $baseUrl] = true;
$class_strut = explode(’/’, c l a s s ) ; i f ( e m p t y ( class); if (empty( class);if(empty(baseUrl)) {
if (’@’ == $class_strut[0] || MODULE_NAME == $class_strut[0]) {
//加载当前模块的类库
$baseUrl = MODULE_PATH;
c l a s s = s u b s t r r e p l a c e ( class = substr_replace( class=substrreplace(class, ‘’, 0, strlen($class_strut[0]) + 1);
}elseif (‘Common’ == $class_strut[0]) {
//加载公共模块的类库
$baseUrl = COMMON_PATH;
c l a s s = s u b s t r ( class = substr( class=substr(class, 7);
}elseif (in_array( c l a s s s t r u t [ 0 ] , a r r a y ( ′ T h i n k ′ , ′ O r g ′ , ′ B e h a v i o r ′ , ′ C o m ′ , ′ V e n d o r ′ ) ) ∣ ∣ i s d i r ( L I B P A T H . class_strut[0],array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH. classstrut[0],array(′Think′,′Org′,′Behavior′,′Com′,′Vendor′))∣∣isdir(LIBPATH.class_strut[0])) {
// 系统类库包和第三方类库包
$baseUrl = LIB_PATH;
}else { // 加载其他模块的类库
KaTeX parse error: Expected 'EOF', got '}' at position 26: …APP_PATH; }̲ } if (substr…baseUrl, -1) != ‘/’)
$baseUrl .= ‘/’;
$classfile = $baseUrl . $class . e x t ; i f ( ! c l a s s e x i s t s ( b a s e n a m e ( ext; if (!class_exists(basename( ext;if(!classexists(basename(class),false)) {
// 如果类不存在 则导入类库文件
return require_cache($classfile);
}
return null;
}
/**
- 基于命名空间方式导入函数库
- load(’@.Util.Array’)
- @param string $name 函数库命名空间字符串
- @param string $baseUrl 起始路径
- @param string $ext 导入的文件扩展名
- @return void
*/
function load($name, $baseUrl=’’, $ext=’.php’) {
$name = str_replace(array(’.’, ‘#’), array(’/’, ‘.’), n a m e ) ; i f ( e m p t y ( name); if (empty( name);if(empty(baseUrl)) {
if (0 === strpos($name, ‘@/’)) {//加载当前模块函数库
$baseUrl = MODULE_PATH.‘Common/’;
n a m e = s u b s t r ( name = substr( name=substr(name, 2);
} else { //加载其他模块函数库
$array = explode(’/’, $name);
b a s e U r l = A P P P A T H . a r r a y s h i f t ( baseUrl = APP_PATH . array_shift( baseUrl=APPPATH.arrayshift(array).’/Common/’;
n a m e = i m p l o d e ( ′ / ′ , name = implode('/', name=implode(′/′,array);
}
}
if (substr($baseUrl, -1) != ‘/’)
b a s e U r l . = ′ / ′ ; r e q u i r e c a c h e ( baseUrl .= '/'; require_cache( baseUrl.=′/′;requirecache(baseUrl . $name . $ext);
}
/**
- 快速导入第三方框架类库 所有第三方框架的类库文件统一放到 系统的Vendor目录下面
- @param string $class 类库
- @param string $baseUrl 基础目录
- @param string $ext 类库后缀
- @return boolean
*/
function vendor($class, $baseUrl = ‘’, KaTeX parse error: Expected '}', got 'EOF' at end of input: …) { if (empty(baseUrl))
b a s e U r l = V E N D O R P A T H ; r e t u r n i m p o r t ( baseUrl = VENDOR_PATH; return import( baseUrl=VENDORPATH;returnimport(class, $baseUrl, $ext);
}
/**
- 实例化模型类 格式 [资源://][模块/]模型
- @param string $name 资源地址
- @param string $layer 模型层名称
- @return Think\Model
*/
function D( n a m e = ′ ′ , name='', name=′′,layer=’’) {
if(empty($name)) return new Think\Model;
static $_model = array();
$layer = KaTeX parse error: Double subscript at position 22: … : C('DEFAULT_M_̲LAYER'); if(is…_model[ n a m e . name. name.layer]))
return m o d e l [ _model[ model[name.$layer];
c l a s s = p a r s e r e s n a m e ( class = parse_res_name( class=parseresname(name, l a y e r ) ; i f ( c l a s s e x i s t s ( layer); if(class_exists( layer);if(classexists(class)) {
$model = new c l a s s ( b a s e n a m e ( class(basename( class(basename(name));
}elseif(false === strpos(KaTeX parse error: Expected '}', got 'EOF' at end of input: …port('Common/'.layer.’/’.$class);
}else{
c l a s s = ′ C o m m o n ′ . class = '\\Common\\'. class=′Common′.layer.’\’. n a m e . name. name.layer;
}
m o d e l = c l a s s e x i s t s ( model = class_exists( model=classexists(class)? new c l a s s ( class( class(name) : new Think\Model(KaTeX parse error: Expected 'EOF', got '}' at position 9: name); }̲else { Thi…class,Think\Log::NOTICE);
KaTeX parse error: Expected 'EOF', got '\Model' at position 25: … = new Think\̲M̲o̲d̲e̲l̲(basename(name));
}
m o d e l [ _model[ model[name.$layer] = $model;
return $model;
}
/**
- 实例化一个没有模型文件的Model
- @param string $name Model名称 支持指定基础模型 例如 MongoModel:User
- @param string $tablePrefix 表前缀
- @param mixed $connection 数据库连接信息
- @return Think\Model
*/
function M($name=’’, t a b l e P r e f i x = ′ ′ , tablePrefix='', tablePrefix=′′,connection=’’) {
static m o d e l = a r r a y ( ) ; i f ( s t r p o s ( _model = array(); if(strpos( model=array();if(strpos(name,’:’)) {
list( c l a s s , class, class,name) = explode(’:’,$name);
}else{
$class = ‘Think\Model’;
}
g u i d = ( i s a r r a y ( guid = (is_array( guid=(isarray(connection)?implode(’’, c o n n e c t i o n ) : connection): connection):connection).$tablePrefix . $name . ‘_’ . c l a s s ; i f ( ! i s s e t ( class; if (!isset( class;if(!isset(_model[$guid]))
m o d e l [ _model[ model[guid] = new c l a s s ( class( class(name, t a b l e P r e f i x , tablePrefix, tablePrefix,connection);
return m o d e l [ _model[ model[guid];
}
/**
- 解析资源地址并导入类库文件
- 例如 module/controller addon://module/behavior
- @param string $name 资源地址 格式:[扩展://][模块/]资源名
- @param string $layer 分层名称
- @param integer $level 控制器层次
- @return string
*/
function parse_res_name( n a m e , name, name,layer,KaTeX parse error: Expected '}', got 'EOF' at end of input: …1){ if(strpos(name,’?/’)) {// 指定扩展资源
list( e x t e n d , extend, extend,name) = explode(’?/’,$name);
}else{
KaTeX parse error: Expected 'EOF', got '}' at position 18: …tend = ''; }̲ if(strpos(name,’/’) && substr_count( n a m e , ′ / ′ ) > = name, '/')>= name,′/′)>=level){ // 指定模块
list( m o d u l e , module, module,name) = explode(’/’,$name,2);
}else{
$module = defined(‘MODULE_NAME’) ? MODULE_NAME : ‘’ ;
}
a r r a y = e x p l o d e ( ′ / ′ , array = explode('/', array=explode(′/′,name);
if(!C(‘APP_USE_NAMESPACE’)){
c l a s s = p a r s e n a m e ( class = parse_name( class=parsename(name, 1);
import( m o d u l e . ′ / ′ . module.'/'. module.′/′.layer.’/’. c l a s s . class. class.layer);
}else{
$class = m o d u l e . ′ ′ . module.'\\'. module.′′.layer;
foreach($array as $name){
c l a s s . = ′ ′ . p a r s e n a m e ( class .= '\\'.parse_name( class.=′′.parsename(name, 1);
}
// 导入资源类库
if($extend){ // 扩展资源
$class = e x t e n d . ′ ′ . extend.'\\'. extend.′′.class;
}
}
return c l a s s . class. class.layer;
}
/**
- 用于实例化访问控制器
- @param string $name 控制器名
- @param string $path 控制器命名空间(路径)
- @return Think\Controller|false
*/
function controller( n a m e , name, name,path=’’){
$layer = C(‘DEFAULT_C_LAYER’);
if(!C(‘APP_USE_NAMESPACE’)){
c l a s s = p a r s e n a m e ( class = parse_name( class=parsename(name, 1). l a y e r ; i m p o r t ( M O D U L E N A M E . ′ / ′ . layer; import(MODULE_NAME.'/'. layer;import(MODULENAME.′/′.layer.’/’.$class);
}else{
$class = ( p a t h ? b a s e n a m e ( A D D O N P A T H ) . ′ ′ . path ? basename(ADDON_PATH).'\\'. path?basename(ADDONPATH).′′.path : MODULE_NAME ).’\’.$layer;
a r r a y = e x p l o d e ( ′ / ′ , array = explode('/', array=explode(′/′,name);
foreach($array as $name){
c l a s s . = ′ ′ . p a r s e n a m e ( class .= '\\'.parse_name( class.=′′.parsename(name, 1);
}
$class .= KaTeX parse error: Expected 'EOF', got '}' at position 9: layer; }̲ if(class_exis…class)) {
return new $class();
}else {
return false;
}
}
/**
-
实例化多层控制器 格式:[资源://][模块/]控制器
-
@param string $name 资源地址
-
@param string $layer 控制层名称
-
@param integer $level 控制器层次
-
@return Think\Controller|false
*/
function A( n a m e , name, name,layer=’’,$level=0) {
static $_action = array();
$layer = $layer? : C(‘DEFAULT_C_LAYER’);
$level = l e v e l ? : ( level? : ( level?:(layer == C(‘DEFAULT_C_LAYER’)?C(‘CONTROLLER_LEVEL’):1);
if(isset( a c t i o n [ _action[ action[name.$layer]))
return a c t i o n [ _action[ action[name.$layer];c l a s s = p a r s e r e s n a m e ( class = parse_res_name( class=parseresname(name, l a y e r , layer, layer,level);
if(class_exists($class)) {
$action = new $class();
a c t i o n [ _action[ action[name.$layer] = $action;
return $action;
}else {
return false;
}
}
/**
- 远程调用控制器的操作方法 URL 参数格式 [资源://][模块/]控制器/操作
- @param string $url 调用地址
- @param string|array $vars 调用参数 支持字符串和数组
- @param string $layer 要调用的控制层名称
- @return mixed
*/
function R( u r l , url, url,vars=array(),$layer=’’) {
i n f o = p a t h i n f o ( info = pathinfo( info=pathinfo(url);
$action = $info[‘basename’];
$module = $info[‘dirname’];
c l a s s = A ( class = A( class=A(module, l a y e r ) ; i f ( layer); if( layer);if(class){
if(is_string(KaTeX parse error: Expected '}', got 'EOF' at end of input: … parse_str(vars,KaTeX parse error: Expected 'EOF', got '}' at position 13: vars); }̲ return ca…class, a c t i o n . C ( ′ A C T I O N S U F F I X ′ ) ) , action.C('ACTION_SUFFIX')), action.C(′ACTIONSUFFIX′)),vars);
}else{
return false;
}
}
/**
- 处理标签扩展
- @param string $tag 标签名称
- @param mixed $params 传入参数
- @return void
*/
function tag(KaTeX parse error: Expected 'EOF', got '&' at position 6: tag, &̲params=NULL) {
\Think\Hook::listen( t a g , tag, tag,params);
}
/**
- 执行某个行为
- @param string $name 行为名称
- @param string $tag 标签名称(行为类无需传入)
- @param Mixed $params 传入的参数
- @return void
*/
function B($name, KaTeX parse error: Expected 'EOF', got '&' at position 8: tag='',&̲params=NULL) {
if(’’==$tag){
KaTeX parse error: Expected 'EOF', got '}' at position 25: … 'Behavior'; }̲ return \Think…name, t a g , tag, tag,params);
}
/**
- 去除代码中的空白和注释
- @param string $content 代码内容
- @return string
*/
function strip_whitespace($content) {
$stripStr = ‘’;
//分析php源码
t o k e n s = t o k e n g e t a l l ( tokens = token_get_all( tokens=tokengetall(content);
l a s t s p a c e = f a l s e ; f o r ( last_space = false; for ( lastspace=false;for(i = 0, j = c o u n t ( j = count( j=count(tokens); $i < $j; KaTeX parse error: Expected '}', got 'EOF' at end of input: … if (is_string(tokens[$i])) {
$last_space = false;
$stripStr .= t o k e n s [ tokens[ tokens[i];
} else {
switch ( t o k e n s [ tokens[ tokens[i][0]) {
//过滤各种PHP注释
case T_COMMENT:
case T_DOC_COMMENT:
break;
//过滤空格
case T_WHITESPACE:
if (!$last_space) {
$stripStr .= ’ ';
$last_space = true;
}
break;
case T_START_HEREDOC:
$stripStr .= “<<<THINK\n”;
break;
case T_END_HEREDOC:
KaTeX parse error: Expected 'EOF', got '\n' at position 20: …pStr .= "THINK;\̲n̲"; …k = $i+1; $k < $j; KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(is_string(tokens[$k]) && t o k e n s [ tokens[ tokens[k] == ‘;’) {
$i = KaTeX parse error: Expected 'EOF', got '}' at position 57: … }̲ else if(tokens[$k][0] == T_CLOSE_TAG) {
break;
}
}
break;
default:
$last_space = false;
$stripStr .= t o k e n s [ tokens[ tokens[i][1];
}
}
}
return $stripStr;
}
/**
- 自定义异常处理
- @param string $msg 异常消息
- @param string $type 异常类型 默认为Think\Exception
- @param integer $code 异常代码 默认为0
- @return void
*/
function throw_exception($msg, $type=‘Think\Exception’, KaTeX parse error: Expected '}', got '\Log' at position 17: …ode=0) { Think\̲L̲o̲g̲::record('建议使用E…type, false))
throw new t y p e ( type( type(msg, KaTeX parse error: Expected 'EOF', got '\Think' at position 24: …else Think\̲T̲h̲i̲n̲k̲::halt(msg); // 异常类型不存在则输出错误信息字串
}
/**
- 浏览器友好的变量输出
- @param mixed $var 变量
- @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串
- @param string $label 标签 默认为空
- @param boolean $strict 是否严谨 默认为true
- @return void|string
*/
function dump($var, $echo=true, $label=null, $strict=true) {
l a b e l = ( label = ( label=(label === null) ? ‘’ : rtrim(KaTeX parse error: Double superscript at position 12: label) . ' '̲; if (!strict) {
if (ini_get(‘html_errors’)) {
o u t p u t = p r i n t r ( output = print_r( output=printr(var, true);
$output = ‘’ . l a b e l . h t m l s p e c i a l c h a r s ( label . htmlspecialchars( label.htmlspecialchars(output, ENT_QUOTES) . ‘
’;
} else {
$output = l a b e l . p r i n t r ( label . print_r( label.printr(var, true);
}
} else {
ob_start();
var_dump($var);
$output = ob_get_clean();
if (!extension_loaded(‘xdebug’)) {
$output = preg_replace(’/]=>\n(\s+)/m’, '] => ', $output);
$output = ‘’ . l a b e l . h t m l s p e c i a l c h a r s ( label . htmlspecialchars( label.htmlspecialchars(output, ENT_QUOTES) . ‘
’;
}
}
if (KaTeX parse error: Expected '}', got 'EOF' at end of input: …o) { echo(output);
return null;
}else
return $output;
}
/**
- 设置当前页面的布局
- @param string|false $layout 布局名称 为false的时候表示关闭布局
- @return void
*/
function layout($layout) {
if(false !== KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(is_string(layout)) { // 设置新的布局模板
C(‘LAYOUT_NAME’,$layout);
}
}else{// 临时关闭布局
C(‘LAYOUT_ON’,false);
}
}
/**
-
URL组装 支持不同URL模式
-
@param string $url URL表达式,格式:’[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2…’
-
@param string|array $vars 传入的参数,支持数组和字符串
-
@param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值
-
@param boolean $domain 是否显示域名
-
@return string
*/
function U( u r l = ′ ′ , url='', url=′′,vars=’’, s u f f i x = t r u e , suffix=true, suffix=true,domain=false) {
// 解析URL
i n f o = p a r s e u r l ( info = parse_url( info=parseurl(url);
u r l = ! e m p t y ( url = !empty( url=!empty(info[‘path’])? i n f o [ ′ p a t h ′ ] : A C T I O N N A M E ; i f ( i s s e t ( info['path']:ACTION_NAME; if(isset( info[′path′]:ACTIONNAME;if(isset(info[‘fragment’])) { // 解析锚点
$anchor = i n f o [ ′ f r a g m e n t ′ ] ; i f ( f a l s e ! = = s t r p o s ( info['fragment']; if(false !== strpos( info[′fragment′];if(false!==strpos(anchor,’?’)) { // 解析参数
list( a n c h o r , anchor, anchor,info[‘query’]) = explode(’?’,KaTeX parse error: Expected 'EOF', got '}' at position 17: …nchor,2); }̲ i…anchor,’@’)) { // 解析域名
list( a n c h o r , anchor, anchor,host) = explode(’@’,KaTeX parse error: Expected 'EOF', got '}' at position 18: …chor, 2); }̲ }elseif(false…url,’@’)) { // 解析域名
list( u r l , url, url,host) = explode(’@’,KaTeX parse error: Expected 'EOF', got '}' at position 20: …['path'], 2); }̲ // 解析子域名 if(…host)) {
$domain = h o s t . ( s t r p o s ( host.(strpos( host.(strpos(host,’.’)?’’:strstr(KaTeX parse error: Expected 'EOF', got '}' at position 30: …HOST'],'.')); }̲elseif(domain===true){
$domain = $_SERVER[‘HTTP_HOST’];
if(C(‘APP_SUB_DOMAIN_DEPLOY’) ) { // 开启子域名部署
$domain = d o m a i n = = ′ l o c a l h o s t ′ ? ′ l o c a l h o s t ′ : ′ w w w ′ . s t r s t r ( domain=='localhost'?'localhost':'www'.strstr( domain==′localhost′?′localhost′:′www′.strstr(_SERVER[‘HTTP_HOST’],’.’);
// ‘子域名’=>array(‘模块[/控制器]’);
foreach (C(‘APP_SUB_DOMAIN_RULES’) as $key => $rule) {
r u l e = i s a r r a y ( rule = is_array( rule=isarray(rule)? r u l e [ 0 ] : rule[0]: rule[0]:rule;
if(false === strpos(KaTeX parse error: Expected 'EOF', got '&' at position 10: key,'*') &̲& 0=== strpos(url,$rule)) {
$domain = k e y . s t r s t r ( key.strstr( key.strstr(domain,’.’); // 生成对应子域名
u r l = s u b s t r r e p l a c e ( url = substr_replace( url=substrreplace(url,’’,0,strlen($rule));
break;
}
}
}
}// 解析参数
if(is_string(KaTeX parse error: Expected '}', got '&' at position 18: …rs)) { // aaa=1&̲bbb=2 转换成数组 …vars,KaTeX parse error: Expected 'EOF', got '}' at position 9: vars); }̲elseif(!is_arra…vars)){
KaTeX parse error: Expected 'EOF', got '}' at position 18: …rs = array(); }̲ if(isset(info[‘query’])) { // 解析地址里面参数 合并到vars
parse_str( i n f o [ ′ q u e r y ′ ] , info['query'], info[′query′],params);
v a r s = a r r a y m e r g e ( vars = array_merge( vars=arraymerge(params,$vars);
}// URL组装
$depr = C(‘URL_PATHINFO_DEPR’);
u r l C a s e = C ( ′ U R L C A S E I N S E N S I T I V E ′ ) ; i f ( urlCase = C('URL_CASE_INSENSITIVE'); if( urlCase=C(′URLCASEINSENSITIVE′);if(url) {
if(0=== strpos($url,’/’)) {// 定义路由
$route = true;
u r l = s u b s t r ( url = substr( url=substr(url,1);
if(’/’ != $depr) {
u r l = s t r r e p l a c e ( ′ / ′ , url = str_replace('/', url=strreplace(′/′,depr,$url);
}
}else{
if(’/’ != $depr) { // 安全替换
u r l = s t r r e p l a c e ( ′ / ′ , url = str_replace('/', url=strreplace(′/′,depr,$url);
}
// 解析模块、控制器和操作
u r l = t r i m ( url = trim( url=trim(url,$depr);
p a t h = e x p l o d e ( path = explode( path=explode(depr,$url);
$var = array();
$varModule = C(‘VAR_MODULE’);
$varController = C(‘VAR_CONTROLLER’);
$varAction = C(‘VAR_ACTION’);
v a r [ var[ var[varAction] = !empty( p a t h ) ? a r r a y p o p ( path)?array_pop( path)?arraypop(path):ACTION_NAME;
v a r [ var[ var[varController] = !empty( p a t h ) ? a r r a y p o p ( path)?array_pop( path)?arraypop(path):CONTROLLER_NAME;
if(KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(isset(maps[strtolower( v a r [ var[ var[varController])])) {
$maps = m a p s [ s t r t o l o w e r ( maps[strtolower( maps[strtolower(var[ v a r C o n t r o l l e r ] ) ] ; i f ( varController])]; if( varController])];if(action = array_search(strtolower( v a r [ var[ var[varAction]),$maps)){
v a r [ var[ var[varAction] = KaTeX parse error: Expected 'EOF', got '}' at position 26: … }̲ }…maps = C(‘URL_CONTROLLER_MAP’)) {
if( c o n t r o l l e r = a r r a y s e a r c h ( s t r t o l o w e r ( controller = array_search(strtolower( controller=arraysearch(strtolower(var[ v a r C o n t r o l l e r ] ) , varController]), varController]),maps)){
v a r [ var[ var[varController] = KaTeX parse error: Expected 'EOF', got '}' at position 26: …; }̲ } …urlCase) {
v a r [ var[ var[varController] = parse_name( v a r [ var[ var[varController]);
}
$module = ‘’;if(!empty($path)) { $var[$varModule] = implode($depr,$path); }else{ if(C('MULTI_MODULE')) { if(MODULE_NAME != C('DEFAULT_MODULE') || !C('MODULE_ALLOW_LIST')){ $var[$varModule]= MODULE_NAME; } } } if($maps = C('URL_MODULE_MAP')) { if($_module = array_search(strtolower($var[$varModule]),$maps)){ $var[$varModule] = $_module; } } if(isset($var[$varModule])){ $module = $var[$varModule]; unset($var[$varModule]); } }
}
if(C(‘URL_MODEL’) == 0) { // 普通模式URL转换
KaTeX parse error: Expected group after '_' at position 16: url = _̲_APP__.'?'.C('V…module}&".http_build_query(array_reverse( v a r ) ) ; i f ( var)); if( var));if(urlCase){
u r l = s t r t o l o w e r ( url = strtolower( url=strtolower(url);
}
if(!empty($vars)) {
v a r s = h t t p b u i l d q u e r y ( vars = http_build_query( vars=httpbuildquery(vars);
KaTeX parse error: Expected 'EOF', got '&' at position 13: url .= '&̲'.vars;
}
}else{ // PATHINFO模式或者兼容URL模式
if(isset($route)) {
KaTeX parse error: Expected group after '_' at position 12: url = _̲_APP__.'/'.rtri…url,$depr);
}else{
KaTeX parse error: Expected 'EOF', got '&' at position 36: …'BIND_MODULE') &̲& BIND_MODULE==module )? ‘’ : $module;
KaTeX parse error: Expected group after '_' at position 12: url = _̲_APP__.'/'.(module? m o d u l e . M O D U L E P A T H I N F O D E P R : ′ ′ ) . i m p l o d e ( module.MODULE_PATHINFO_DEPR:'').implode( module.MODULEPATHINFODEPR:′′).implode(depr,array_reverse(KaTeX parse error: Expected 'EOF', got '}' at position 13: var)); }̲ if(urlCase){
u r l = s t r t o l o w e r ( url = strtolower( url=strtolower(url);
}
if(!empty(KaTeX parse error: Expected '}', got 'EOF' at end of input: … foreach (vars as $var => KaTeX parse error: Expected '}', got 'EOF' at end of input: …if('' !== trim(val)) $url .= $depr . $var . d e p r . u r l e n c o d e ( depr . urlencode( depr.urlencode(val);
}
}
if($suffix) {
$suffix = s u f f i x = = = t r u e ? C ( ′ U R L H T M L S U F F I X ′ ) : suffix===true?C('URL_HTML_SUFFIX'): suffix===true?C(′URLHTMLSUFFIX′):suffix;
if( p o s = s t r p o s ( pos = strpos( pos=strpos(suffix, ‘|’)){
s u f f i x = s u b s t r ( suffix = substr( suffix=substr(suffix, 0, KaTeX parse error: Expected 'EOF', got '}' at position 16: pos); }̲ if(suffix && ‘/’ != substr($url,-1)){
u r l . = ′ . ′ . l t r i m ( url .= '.'.ltrim( url.=′.′.ltrim(suffix,’.’);
}
}
}
if(isset($anchor)){
KaTeX parse error: Expected 'EOF', got '#' at position 10: url .= '#̲'.anchor;
}
if($domain) {
u r l = ( i s s s l ( ) ? ′ h t t p s : / / ′ : ′ h t t p : / / ′ ) . url = (is_ssl()?'https://':'http://'). url=(isssl()?′https://′:′http://′).domain.$url;
}
return $url;
}
/**
- 渲染输出Widget
- @param string $name Widget名称
- @param array $data 传入的参数
- @return void
*/
function W($name, KaTeX parse error: Expected '}', got 'EOF' at end of input: …)) { return R(name,$data,‘Widget’);
}
/**
- 判断是否SSL协议
- @return boolean
*/
function is_ssl() {
if(isset($_SERVER[‘HTTPS’]) && (‘1’ == S E R V E R [ ′ H T T P S ′ ] ∣ ∣ ′ o n ′ = = s t r t o l o w e r ( _SERVER['HTTPS'] || 'on' == strtolower( SERVER[′HTTPS′]∣∣′on′==strtolower(_SERVER[‘HTTPS’]))){
return true;
}elseif(isset($_SERVER[‘SERVER_PORT’]) && (‘443’ == $_SERVER[‘SERVER_PORT’] )) {
return true;
}
return false;
}
/**
- URL重定向
- @param string $url 重定向的URL地址
- @param integer $time 重定向的等待时间(秒)
- @param string $msg 重定向前的提示信息
- @return void
*/
function redirect($url, $time=0, $msg=’’) {
//多行URL地址支持
$url = str_replace(array("\n", “\r”), ‘’, u r l ) ; i f ( e m p t y ( url); if (empty( url);if(empty(msg))
KaTeX parse error: Expected '}', got 'EOF' at end of input: msg = "系统将在{time}秒之后自动跳转到{$url}!";
if (!headers_sent()) {
// redirect
if (0 === $time) {
header('Location: ’ . KaTeX parse error: Expected 'EOF', got '}' at position 12: url); }̲ else { …time};url={KaTeX parse error: Expected 'EOF', got '}' at position 4: url}̲"); ec…msg);
}
exit();
} else {
KaTeX parse error: Expected '}', got 'EOF' at end of input: …esh' content='{time};URL={KaTeX parse error: Expected 'EOF', got '}' at position 4: url}̲'>"; if (time != 0)
$str .= m s g ; e x i t ( msg; exit( msg;exit(str);
}
}
/**
- 缓存管理
- @param mixed $name 缓存名称,如果为数组表示进行缓存设置
- @param mixed $value 缓存值
- @param mixed $options 缓存参数
- @return mixed
*/
function S( n a m e , name, name,value=’’,$options=null) {
static c a c h e = ′ ′ ; i f ( i s a r r a y ( cache = ''; if(is_array( cache=′′;if(isarray(options)){
// 缓存操作的同时初始化
t y p e = i s s e t ( type = isset( type=isset(options[‘type’])?$options[‘type’]:’’;
KaTeX parse error: Expected 'EOF', got '\Cache' at position 21: … = Think\̲C̲a̲c̲h̲e̲::getInstance(type,KaTeX parse error: Expected 'EOF', got '}' at position 12: options); }̲elseif(is_array…name)) { // 缓存初始化
t y p e = i s s e t ( type = isset( type=isset(name[‘type’])?$name[‘type’]:’’;
KaTeX parse error: Expected 'EOF', got '\Cache' at position 21: … = Think\̲C̲a̲c̲h̲e̲::getInstance(type,$name);
return KaTeX parse error: Expected 'EOF', got '}' at position 9: cache; }̲elseif(empty(cache)) { // 自动初始化
$cache = Think\Cache::getInstance();
}
if(’’=== $value){ // 获取缓存
return c a c h e − > g e t ( cache->get( cache−>get(name);
}elseif(is_null($value)) { // 删除缓存
return c a c h e − > r m ( cache->rm( cache−>rm(name);
}else { // 缓存数据
if(is_array($options)) {
e x p i r e = i s s e t ( expire = isset( expire=isset(options[‘expire’])?$options[‘expire’]:NULL;
}else{
e x p i r e = i s n u m e r i c ( expire = is_numeric( expire=isnumeric(options)?$options:NULL;
}
return c a c h e − > s e t ( cache->set( cache−>set(name, $value, $expire);
}
}
/**
- 快速文件数据读取和保存 针对简单类型数据 字符串、数组
- @param string $name 缓存名称
- @param mixed $value 缓存值
- @param string $path 缓存路径
- @return mixed
*/
function F($name, $value=’’, $path=DATA_PATH) {
static $_cache = array();
$filename = $path . $name . ‘.php’;
if (’’ !== KaTeX parse error: Expected '}', got 'EOF' at end of input: … if (is_null(value)) {
// 删除缓存
if(false !== strpos(KaTeX parse error: Expected '}', got 'EOF' at end of input: … unset(_cache[KaTeX parse error: Expected 'EOF', got '\Storage' at position 34: … return Think\̲S̲t̲o̲r̲a̲g̲e̲::unlink(filename,‘F’);
}
} else {
Think\Storage::put( f i l e n a m e , s e r i a l i z e ( filename,serialize( filename,serialize(value),‘F’);
// 缓存数据
c a c h e [ _cache[ cache[name] = KaTeX parse error: Expected 'EOF', got '}' at position 35: …urn null; }̲ } // 获取缓存数据 …_cache[$name]))
return c a c h e [ _cache[ cache[name];
if (Think\Storage::has($filename,‘F’)){
KaTeX parse error: Expected 'EOF', got '\Storage' at position 33: …serialize(Think\̲S̲t̲o̲r̲a̲g̲e̲::read(filename,‘F’));
c a c h e [ _cache[ cache[name] = $value;
} else {
$value = false;
}
return $value;
}
/**
- 根据PHP各种类型变量生成唯一标识号
- @param mixed $mix 变量
- @return string
*/
function to_guid_string(KaTeX parse error: Expected '}', got 'EOF' at end of input: … if (is_object(mix)) {
return spl_object_hash(KaTeX parse error: Expected 'EOF', got '}' at position 8: mix); }̲ elseif (is_res…mix)) {
m i x = g e t r e s o u r c e t y p e ( mix = get_resource_type( mix=getresourcetype(mix) . strval($mix);
} else {
m i x = s e r i a l i z e ( mix = serialize( mix=serialize(mix);
}
return md5($mix);
}
/**
- XML编码
- @param mixed $data 数据
- @param string $root 根节点名
- @param string $item 数字索引的子节点名
- @param string $attr 根节点属性
- @param string $id 数字索引子节点key转换的属性名
- @param string $encoding 数据编码
- @return string
*/
function xml_encode($data, $root=‘think’, $item=‘item’, $attr=’’, $id=‘id’, KaTeX parse error: Expected '}', got 'EOF' at end of input: …{ if(is_array(attr)){
a t t r = a r r a y ( ) ; f o r e a c h ( _attr = array(); foreach ( attr=array();foreach(attr as $key => $value) {
KaTeX parse error: Expected '}', got 'EOF' at end of input: _attr[] = "{key}="{$value}"";
}
$attr = implode(’ ', $_attr);
}
a t t r = t r i m ( attr = trim( attr=trim(attr);
a t t r = e m p t y ( attr = empty( attr=empty(attr) ? ‘’ : " {$attr}";
KaTeX parse error: Can't use function '\"' in math mode at position 25: …"<?xml version=\̲"̲1.0\" encoding=…encoding}"?>";
KaTeX parse error: Expected '}', got 'EOF' at end of input: xml .= "<{root}{$attr}>";
x m l . = d a t a t o x m l ( xml .= data_to_xml( xml.=datatoxml(data, $item, $id);
KaTeX parse error: Expected '}', got 'EOF' at end of input: xml .= "</{root}>";
return $xml;
}
/**
- 数据XML编码
- @param mixed $data 数据
- @param string $item 数字索引时的节点名称
- @param string $id 数字索引key转换为的属性名
- @return string
*/
function data_to_xml($data, $item=‘item’, $id=‘id’) {
$xml = a t t r = ′ ′ ; f o r e a c h ( attr = ''; foreach ( attr=′′;foreach(data as $key => KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(is_numeric(key)){
$id && KaTeX parse error: Expected '}', got 'EOF' at end of input: attr = " {id}="{$key}"";
$key = $item;
}
KaTeX parse error: Expected '}', got 'EOF' at end of input: xml .= "<{key}{$attr}>";
x m l . = ( i s a r r a y ( xml .= (is_array( xml.=(isarray(val) || is_object( v a l ) ) ? d a t a t o x m l ( val)) ? data_to_xml( val))?datatoxml(val, $item, $id) : $val;
KaTeX parse error: Expected '}', got 'EOF' at end of input: xml .= "</{key}>";
}
return $xml;
}
/**
- session管理函数
- @param string|array $name session名称 如果为数组则表示进行session设置
- @param mixed $value session值
- @return mixed
*/
function session( n a m e = ′ ′ , name='', name=′′,value=’’) {
p r e f i x = C ( ′ S E S S I O N P R E F I X ′ ) ; i f ( i s a r r a y ( prefix = C('SESSION_PREFIX'); if(is_array( prefix=C(′SESSIONPREFIX′);if(isarray(name)) { // session初始化 在session_start 之前调用
if(isset( n a m e [ ′ p r e f i x ′ ] ) ) C ( ′ S E S S I O N P R E F I X ′ , name['prefix'])) C('SESSION_PREFIX', name[′prefix′]))C(′SESSIONPREFIX′,name[‘prefix’]);
if(C(‘VAR_SESSION_ID’) && isset(KaTeX parse error: Expected '}', got 'EOF' at end of input: … session_id(_REQUEST[C(‘VAR_SESSION_ID’)]);
}elseif(isset(KaTeX parse error: Expected '}', got 'EOF' at end of input: … session_id(name[‘id’]);
}
if(‘common’ == APP_MODE){ // 其它模式可能不支持
ini_set(‘session.auto_start’, 0);
}
if(isset( n a m e [ ′ n a m e ′ ] ) ) s e s s i o n n a m e ( name['name'])) session_name( name[′name′]))sessionname(name[‘name’]);
if(isset( n a m e [ ′ p a t h ′ ] ) ) s e s s i o n s a v e p a t h ( name['path'])) session_save_path( name[′path′]))sessionsavepath(name[‘path’]);
if(isset($name[‘domain’])) ini_set(‘session.cookie_domain’, n a m e [ ′ d o m a i n ′ ] ) ; i f ( i s s e t ( name['domain']); if(isset( name[′domain′]);if(isset(name[‘expire’])) {
ini_set(‘session.gc_maxlifetime’, $name[‘expire’]);
ini_set(‘session.cookie_lifetime’, KaTeX parse error: Expected 'EOF', got '}' at position 23: …xpire']); }̲ if(isset(name[‘use_trans_sid’])) ini_set(‘session.use_trans_sid’, n a m e [ ′ u s e t r a n s s i d ′ ] ? 1 : 0 ) ; i f ( i s s e t ( name['use_trans_sid']?1:0); if(isset( name[′usetranssid′]?1:0);if(isset(name[‘use_cookies’])) ini_set(‘session.use_cookies’, n a m e [ ′ u s e c o o k i e s ′ ] ? 1 : 0 ) ; i f ( i s s e t ( name['use_cookies']?1:0); if(isset( name[′usecookies′]?1:0);if(isset(name[‘cache_limiter’])) session_cache_limiter( n a m e [ ′ c a c h e l i m i t e r ′ ] ) ; i f ( i s s e t ( name['cache_limiter']); if(isset( name[′cachelimiter′]);if(isset(name[‘cache_expire’])) session_cache_expire( n a m e [ ′ c a c h e e x p i r e ′ ] ) ; i f ( i s s e t ( name['cache_expire']); if(isset( name[′cacheexpire′]);if(isset(name[‘type’])) C(‘SESSION_TYPE’,$name[‘type’]);
if(C(‘SESSION_TYPE’)) { // 读取session驱动
$type = C(‘SESSION_TYPE’);
c l a s s = s t r p o s ( class = strpos( class=strpos(type,’\’)? t y p e : ′ T h i n k S e s s i o n D r i v e r ′ . u c w o r d s ( s t r t o l o w e r ( type : 'Think\\Session\\Driver\\'. ucwords(strtolower( type:′ThinkSessionDriver′.ucwords(strtolower(type));
$hander = new KaTeX parse error: Expected 'EOF', got '&' at position 64: … array(&̲hander,“open”),
array(&KaTeX parse error: Expected 'EOF', got '&' at position 38: … array(&̲hander,“read”),
array(&KaTeX parse error: Expected 'EOF', got '&' at position 38: … array(&̲hander,“destroy”),
array(&$hander,“gc”));
}
// 启动session
if(C(‘SESSION_AUTO_START’)) session_start();
}elseif(’’ === KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(''===name){
// 获取全部的session
return $prefix ? S E S S I O N [ _SESSION[ SESSION[prefix] : KaTeX parse error: Expected 'EOF', got '}' at position 16: _SESSION; }̲elseif(0===strp…name,’[’)) { // session 操作
if(’[pause]‘ n a m e ) / / 暂 停 s e s s i o n s e s s i o n w r i t e c l o s e ( ) ; e l s e i f ( ′ [ s t a r t ] ′ = = name){ // 暂停session session_write_close(); }elseif('[start]'== name)//暂停sessionsessionwriteclose();elseif(′[start]′==name){ // 启动session
session_start();
}elseif(’[destroy]’$name){ // 销毁session
KaTeX parse error: Expected 'EOF', got '}' at position 93: …oy(); }̲elseif('[regene…name){ // 重新生成id
session_regenerate_id();
}
}elseif(0===strpos($name,’?’)){ // 检查session
n a m e = s u b s t r ( name = substr( name=substr(name,1);
if(strpos(KaTeX parse error: Expected '}', got 'EOF' at end of input: … list(name1, n a m e 2 ) = e x p l o d e ( ′ . ′ , name2) = explode('.', name2)=explode(′.′,name);
return p r e f i x ? i s s e t ( prefix?isset( prefix?isset(_SESSION[ p r e f i x ] [ prefix][ prefix][name1][ n a m e 2 ] ) : i s s e t ( name2]):isset( name2]):isset(_SESSION[ n a m e 1 ] [ name1][ name1][name2]);
}else{
return p r e f i x ? i s s e t ( prefix?isset( prefix?isset(_SESSION[ p r e f i x ] [ prefix][ prefix][name]):isset( S E S S I O N [ _SESSION[ SESSION[name]);
}
}elseif(is_null(KaTeX parse error: Expected '}', got 'EOF' at end of input: …on if(prefix) {
unset( S E S S I O N [ _SESSION[ SESSION[prefix]);
}else{
KaTeX parse error: Expected 'EOF', got '}' at position 30: …ay(); }̲ }elseif(prefix){ // 获取session
if(strpos(KaTeX parse error: Expected '}', got 'EOF' at end of input: … list(name1, n a m e 2 ) = e x p l o d e ( ′ . ′ , name2) = explode('.', name2)=explode(′.′,name);
return isset( S E S S I O N [ _SESSION[ SESSION[prefix][ n a m e 1 ] [ name1][ name1][name2])? S E S S I O N [ _SESSION[ SESSION[prefix][ n a m e 1 ] [ name1][ name1][name2]:null;
}else{
return isset( S E S S I O N [ _SESSION[ SESSION[prefix][ n a m e ] ) ? name])? name])?_SESSION[ p r e f i x ] [ prefix][ prefix][name]:null;
}
}else{
if(strpos(KaTeX parse error: Expected '}', got 'EOF' at end of input: … list(name1, n a m e 2 ) = e x p l o d e ( ′ . ′ , name2) = explode('.', name2)=explode(′.′,name);
return isset( S E S S I O N [ _SESSION[ SESSION[name1][ n a m e 2 ] ) ? name2])? name2])?_SESSION[ n a m e 1 ] [ name1][ name1][name2]:null;
}else{
return isset( S E S S I O N [ _SESSION[ SESSION[name])? S E S S I O N [ _SESSION[ SESSION[name]:null;
}
}
}elseif(is_null(KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(strpos(name,’.’)){
list( n a m e 1 , name1, name1,name2) = explode(’.’, n a m e ) ; i f ( name); if( name);if(prefix){
unset( S E S S I O N [ _SESSION[ SESSION[prefix][ n a m e 1 ] [ name1][ name1][name2]);
}else{
unset( S E S S I O N [ _SESSION[ SESSION[name1][KaTeX parse error: Expected 'EOF', got '}' at position 19: …e2]); }̲ }else{ …prefix){
unset( S E S S I O N [ _SESSION[ SESSION[prefix][KaTeX parse error: Expected 'EOF', got '}' at position 18: …me]); }̲else{ …_SESSION[KaTeX parse error: Expected 'EOF', got '}' at position 18: …me]); }̲ } }else{…name,’.’)){
list( n a m e 1 , name1, name1,name2) = explode(’.’, n a m e ) ; i f ( name); if( name);if(prefix){
S E S S I O N [ _SESSION[ SESSION[prefix][ n a m e 1 ] [ name1][ name1][name2] = $value;
}else{
S E S S I O N [ _SESSION[ SESSION[name1][$name2] = KaTeX parse error: Expected 'EOF', got '}' at position 11: value; }̲ }else{ if…prefix){
S E S S I O N [ _SESSION[ SESSION[prefix][$name] = $value;
}else{
S E S S I O N [ _SESSION[ SESSION[name] = $value;
}
}
}
return null;
}
/**
- Cookie 设置、获取、删除
- @param string $name cookie名称
- @param mixed $value cookie值
- @param mixed $option cookie参数
- @return mixed
*/
function cookie($name=’’, $value=’’, $option=null) {
// 默认设置
c o n f i g = a r r a y ( ′ p r e f i x ′ = > C ( ′ C O O K I E P R E F I X ′ ) , / / c o o k i e 名 称 前 缀 ′ e x p i r e ′ = > C ( ′ C O O K I E E X P I R E ′ ) , / / c o o k i e 保 存 时 间 ′ p a t h ′ = > C ( ′ C O O K I E P A T H ′ ) , / / c o o k i e 保 存 路 径 ′ d o m a i n ′ = > C ( ′ C O O K I E D O M A I N ′ ) , / / c o o k i e 有 效 域 名 ′ s e c u r e ′ = > C ( ′ C O O K I E S E C U R E ′ ) , / / c o o k i e 启 用 安 全 传 输 ′ h t t p o n l y ′ = > C ( ′ C O O K I E H T T P O N L Y ′ ) , / / h t t p o n l y 设 置 ) ; / / 参 数 设 置 ( 会 覆 盖 黙 认 设 置 ) i f ( ! i s n u l l ( config = array( 'prefix' => C('COOKIE_PREFIX'), // cookie 名称前缀 'expire' => C('COOKIE_EXPIRE'), // cookie 保存时间 'path' => C('COOKIE_PATH'), // cookie 保存路径 'domain' => C('COOKIE_DOMAIN'), // cookie 有效域名 'secure' => C('COOKIE_SECURE'), // cookie 启用安全传输 'httponly' => C('COOKIE_HTTPONLY'), // httponly设置 ); // 参数设置(会覆盖黙认设置) if (!is_null( config=array(′prefix′=>C(′COOKIEPREFIX′),//cookie名称前缀′expire′=>C(′COOKIEEXPIRE′),//cookie保存时间′path′=>C(′COOKIEPATH′),//cookie保存路径′domain′=>C(′COOKIEDOMAIN′),//cookie有效域名′secure′=>C(′COOKIESECURE′),//cookie启用安全传输′httponly′=>C(′COOKIEHTTPONLY′),//httponly设置);//参数设置(会覆盖黙认设置)if(!isnull(option)) {
if (is_numeric($option))
$option = array(‘expire’ => o p t i o n ) ; e l s e i f ( i s s t r i n g ( option); elseif (is_string( option);elseif(isstring(option))
parse_str($option, $option);
c o n f i g = a r r a y m e r g e ( config = array_merge( config=arraymerge(config, array_change_key_case(KaTeX parse error: Expected 'EOF', got '}' at position 12: option)); }̲ if(!empty(config[‘httponly’])){
ini_set(“session.cookie_httponly”, 1);
}
// 清除指定前缀的所有cookie
if (is_null(KaTeX parse error: Expected '}', got 'EOF' at end of input: … if (empty(_COOKIE))
return null;
// 要删除的cookie前缀,不指定则删除config设置的指定前缀
p r e f i x = e m p t y ( prefix = empty( prefix=empty(value) ? $config[‘prefix’] : v a l u e ; i f ( ! e m p t y ( value; if (!empty( value;if(!empty(prefix)) {// 如果前缀为空字符串将不作处理直接返回
foreach ($_COOKIE as $key => KaTeX parse error: Expected '}', got 'EOF' at end of input: …(0 === stripos(key, KaTeX parse error: Expected '}', got 'EOF' at end of input: … setcookie(key, ‘’, time() - 3600, $config[‘path’], c o n f i g [ ′ d o m a i n ′ ] , config['domain'], config[′domain′],config[‘secure’], c o n f i g [ ′ h t t p o n l y ′ ] ) ; u n s e t ( config['httponly']); unset( config[′httponly′]);unset(_COOKIE[$key]);
}
}
}
return null;
}elseif(’’ === $name){
// 获取全部的cookie
return $COOKIE;
}
$name = $config[‘prefix’] . str_replace(’.’, '’, $name);
if (’’ === KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(isset(_COOKIE[$name])){
$value = C O O K I E [ _COOKIE[ COOKIE[name];
if(0===strpos($value,‘think:’)){
v a l u e = s u b s t r ( value = substr( value=substr(value,6);
return array_map(‘urldecode’,json_decode(MAGIC_QUOTES_GPC?stripslashes( v a l u e ) : value): value):value,true));
}else{
return KaTeX parse error: Expected 'EOF', got '}' at position 17: …alue; }̲ }else{ …value)) {
setcookie($name, ‘’, time() - 3600, $config[‘path’], c o n f i g [ ′ d o m a i n ′ ] , config['domain'], config[′domain′],config[‘secure’], c o n f i g [ ′ h t t p o n l y ′ ] ) ; u n s e t ( config['httponly']); unset( config[′httponly′]);unset(_COOKIE[KaTeX parse error: Expected 'EOF', got '}' at position 28: …除指定cookie }̲ else { …value)){
v a l u e = ′ t h i n k : ′ . j s o n e n c o d e ( a r r a y m a p ( ′ u r l e n c o d e ′ , value = 'think:'.json_encode(array_map('urlencode', value=′think:′.jsonencode(arraymap(′urlencode′,value));
}
e x p i r e = ! e m p t y ( expire = !empty( expire=!empty(config[‘expire’]) ? time() + intval( c o n f i g [ ′ e x p i r e ′ ] ) : 0 ; s e t c o o k i e ( config['expire']) : 0; setcookie( config[′expire′]):0;setcookie(name, $value, $expire, $config[‘path’], c o n f i g [ ′ d o m a i n ′ ] , config['domain'], config[′domain′],config[‘secure’],$config[‘httponly’]);
C O O K I E [ _COOKIE[ COOKIE[name] = $value;
}
}
return null;
}
/**
- 加载动态扩展文件
- @var string $path 文件路径
- @return void
*/
function load_ext_file(KaTeX parse error: Expected '}', got 'EOF' at end of input: … 加载自定义外部文件 if(files = C(‘LOAD_EXT_FILE’)) {
f i l e s = e x p l o d e ( ′ , ′ , files = explode(',', files=explode(′,′,files);
foreach ($files as $file){
$file = p a t h . ′ C o m m o n / ′ . path.'Common/'. path.′Common/′.file.’.php’;
if(is_file($file)) include KaTeX parse error: Expected 'EOF', got '}' at position 12: file; }̲ } // 加载自定义的动…configs = C(‘LOAD_EXT_CONFIG’)) {
if(is_string($configs)) c o n f i g s = e x p l o d e ( ′ , ′ , configs = explode(',', configs=explode(′,′,configs);
foreach ($configs as k e y = > key=> key=>config){
f i l e = i s f i l e ( file = is_file( file=isfile(config)? $config : p a t h . ′ C o n f / ′ . path.'Conf/'. path.′Conf/′.config.CONF_EXT;
if(is_file(KaTeX parse error: Expected '}', got 'EOF' at end of input: … is_numeric(key)?C(load_config( f i l e ) ) : C ( file)):C( file)):C(key,load_config($file));
}
}
}
}
/**
- 获取客户端IP地址
- @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
- @param boolean $adv 是否进行高级模式获取(有可能被伪装)
- @return mixed
*/
function get_client_ip( t y p e = 0 , type = 0, type=0,adv=false) {
$type = $type ? 1 : 0;
static i p = N U L L ; i f ( ip = NULL; if ( ip=NULL;if(ip !== NULL) return i p [ ip[ ip[type];
if(KaTeX parse error: Expected '}', got 'EOF' at end of input: … if (isset(_SERVER[‘HTTP_X_FORWARDED_FOR’])) {
$arr = explode(’,’, $_SERVER[‘HTTP_X_FORWARDED_FOR’]);
p o s = a r r a y s e a r c h ( ′ u n k n o w n ′ , pos = array_search('unknown', pos=arraysearch(′unknown′,arr);
if(false !== p o s ) u n s e t ( pos) unset( pos)unset(arr[$pos]);
i p = t r i m ( ip = trim( ip=trim(arr[0]);
}elseif (isset($_SERVER[‘HTTP_CLIENT_IP’])) {
$ip = KaTeX parse error: Expected 'EOF', got '}' at position 33: …ENT_IP']; }̲elseif (isset(_SERVER[‘REMOTE_ADDR’])) {
$ip = KaTeX parse error: Expected 'EOF', got '}' at position 30: …E_ADDR']; }̲ }elseif (isse…_SERVER[‘REMOTE_ADDR’])) {
$ip = $_SERVER[‘REMOTE_ADDR’];
}
// IP地址合法验证
l o n g = s p r i n t f ( " long = sprintf("%u",ip2long( long=sprintf("ip));
$ip = l o n g ? a r r a y ( long ? array( long?array(ip, $long) : array(‘0.0.0.0’, 0);
return i p [ ip[ ip[type];
}
/**
- 发送HTTP状态
- @param integer $code 状态码
- @return void
*/
function send_http_status($code) {
static s t a t u s = a r r a y ( / / I n f o r m a t i o n a l 1 x x 100 = > ′ C o n t i n u e ′ , 101 = > ′ S w i t c h i n g P r o t o c o l s ′ , / / S u c c e s s 2 x x 200 = > ′ O K ′ , 201 = > ′ C r e a t e d ′ , 202 = > ′ A c c e p t e d ′ , 203 = > ′ N o n − A u t h o r i t a t i v e I n f o r m a t i o n ′ , 204 = > ′ N o C o n t e n t ′ , 205 = > ′ R e s e t C o n t e n t ′ , 206 = > ′ P a r t i a l C o n t e n t ′ , / / R e d i r e c t i o n 3 x x 300 = > ′ M u l t i p l e C h o i c e s ′ , 301 = > ′ M o v e d P e r m a n e n t l y ′ , 302 = > ′ M o v e d T e m p o r a r i l y ′ , / / 1.1303 = > ′ S e e O t h e r ′ , 304 = > ′ N o t M o d i f i e d ′ , 305 = > ′ U s e P r o x y ′ , / / 306 i s d e p r e c a t e d b u t r e s e r v e d 307 = > ′ T e m p o r a r y R e d i r e c t ′ , / / C l i e n t E r r o r 4 x x 400 = > ′ B a d R e q u e s t ′ , 401 = > ′ U n a u t h o r i z e d ′ , 402 = > ′ P a y m e n t R e q u i r e d ′ , 403 = > ′ F o r b i d d e n ′ , 404 = > ′ N o t F o u n d ′ , 405 = > ′ M e t h o d N o t A l l o w e d ′ , 406 = > ′ N o t A c c e p t a b l e ′ , 407 = > ′ P r o x y A u t h e n t i c a t i o n R e q u i r e d ′ , 408 = > ′ R e q u e s t T i m e o u t ′ , 409 = > ′ C o n f l i c t ′ , 410 = > ′ G o n e ′ , 411 = > ′ L e n g t h R e q u i r e d ′ , 412 = > ′ P r e c o n d i t i o n F a i l e d ′ , 413 = > ′ R e q u e s t E n t i t y T o o L a r g e ′ , 414 = > ′ R e q u e s t − U R I T o o L o n g ′ , 415 = > ′ U n s u p p o r t e d M e d i a T y p e ′ , 416 = > ′ R e q u e s t e d R a n g e N o t S a t i s f i a b l e ′ , 417 = > ′ E x p e c t a t i o n F a i l e d ′ , / / S e r v e r E r r o r 5 x x 500 = > ′ I n t e r n a l S e r v e r E r r o r ′ , 501 = > ′ N o t I m p l e m e n t e d ′ , 502 = > ′ B a d G a t e w a y ′ , 503 = > ′ S e r v i c e U n a v a i l a b l e ′ , 504 = > ′ G a t e w a y T i m e o u t ′ , 505 = > ′ H T T P V e r s i o n N o t S u p p o r t e d ′ , 509 = > ′ B a n d w i d t h L i m i t E x c e e d e d ′ ) ; i f ( i s s e t ( _status = array( // Informational 1xx 100 => 'Continue', 101 => 'Switching Protocols', // Success 2xx 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', // Redirection 3xx 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Moved Temporarily ', // 1.1 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', // 306 is deprecated but reserved 307 => 'Temporary Redirect', // Client Error 4xx 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', // Server Error 5xx 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 509 => 'Bandwidth Limit Exceeded' ); if(isset( status=array(//Informational1xx100=>′Continue′,101=>′SwitchingProtocols′,//Success2xx200=>′OK′,201=>′Created′,202=>′Accepted′,203=>′Non−AuthoritativeInformation′,204=>′NoContent′,205=>′ResetContent′,206=>′PartialContent′,//Redirection3xx300=>′MultipleChoices′,301=>′MovedPermanently′,302=>′MovedTemporarily′,//1.1303=>′SeeOther′,304=>′NotModified′,305=>′UseProxy′,//306isdeprecatedbutreserved307=>′TemporaryRedirect′,//ClientError4xx400=>′BadRequest′,401=>′Unauthorized′,402=>′PaymentRequired′,403=>′Forbidden′,404=>′NotFound′,405=>′MethodNotAllowed′,406=>′NotAcceptable′,407=>′ProxyAuthenticationRequired′,408=>′RequestTimeout′,409=>′Conflict′,410=>′Gone′,411=>′LengthRequired′,412=>′PreconditionFailed′,413=>′RequestEntityTooLarge′,414=>′Request−URITooLong′,415=>′UnsupportedMediaType′,416=>′RequestedRangeNotSatisfiable′,417=>′ExpectationFailed′,//ServerError5xx500=>′InternalServerError′,501=>′NotImplemented′,502=>′BadGateway′,503=>′ServiceUnavailable′,504=>′GatewayTimeout′,505=>′HTTPVersionNotSupported′,509=>′BandwidthLimitExceeded′);if(isset(_status[KaTeX parse error: Expected '}', got 'EOF' at end of input: …er('HTTP/1.1 '.code.’ '. s t a t u s [ _status[ status[code]);
// 确保FastCGI模式下正常
header(‘Status:’.KaTeX parse error: Double superscript at position 8: code.' '̲._status[$code]);
}
}
function think_filter(&$value){
// TODO 其他安全过滤
// 过滤查询特殊字符
if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){
$value .= ' ';
}
}
// 不区分大小写的in_array实现
function in_array_case(
v
a
l
u
e
,
value,
value,array){
return in_array(strtolower(
v
a
l
u
e
)
,
a
r
r
a
y
m
a
p
(
′
s
t
r
t
o
l
o
w
e
r
′
,
value),array_map('strtolower',
value),arraymap(′strtolower′,array));
}