这篇文章介绍的内容是关于ThinkPHP字母函数,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
<?php/////////////////////////////////////////////////////////A///////////////////////////////////////////////////////////////**
* 实例化多层控制器 格式:[资源://][模块/]控制器
* @param string $name 资源地址
* @param string $layer 控制层名称
* @param integer $level 控制器层次
* @return ThinkController|false
*/function A($name,$layer='',$level=0) {
static $_action = array();
$layer = $layer? : C('DEFAULT_C_LAYER');
$level = $level? : ($layer == C('DEFAULT_C_LAYER')?C('CONTROLLER_LEVEL'):1);
if(isset($_action[$name.$layer]))
return $_action[$name.$layer];
$class = parse_res_name($name,$layer,$level);
if(class_exists($class)) {
$action = new $class();
$_action[$name.$layer] = $action;
return $action;
}else { return false;
}
}////////////////////////////////////////////////////////B////////////////////////////////////////////////////////////////**
* 执行某个行为
* @param string $name 行为名称
* @param string $tag 标签名称(行为类无需传入)
* @param Mixed $params 传入的参数
* @return void
*/function B($name, $tag='',&$params=NULL) {
if(''==$tag){ $name .= 'Behavior';
} return ThinkHook::exec($name,$tag,$params);
}////////////////////////////////////////////////////////C////////////////////////////////////////////////////////////////**
* 获取和设置配置参数 支持批量定义
* @param string|array $name 配置变量
* @param mixed $value 配置值
* @param mixed $default 默认值
* @return mixed
*/function C($name=null, $value=null,$default=null) {
static $_config = array(); // 无参数时获取所有
if (empty($name)) { return $_config;
} // 优先执行设置获取或赋值
if (is_string($name)) { if (!strpos($name, '.')) {
$name = strtoupper($name);
if (is_null($value))
return isset($_config[$name]) ? $_config[$name] : $default;
$_config[$name] = $value;
return null;
} // 二维数组设置和获取支持
$name = explode('.', $name);
$name[0] = strtoupper($name[0]);
if (is_null($value))
return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : $default;
$_config[$name[0]][$name[1]] = $value;
return null;
} // 批量设置
if (is_array($name)){ $_config = array_merge($_config, array_change_key_case($name,CASE_UPPER)); return null;
} return null; // 避免非法参数}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 实例化模型类 格式 [资源://][模块/]模型
* @param string $name 资源地址
* @param string $layer 模型层名称
* @return ThinkModel
*/function D($name='',$layer='') {
if(empty($name)) return new ThinkModel;
static $_model = array(); $layer = $layer? : C('DEFAULT_M_LAYER');
if(isset($_model[$name.$layer])) return $_model[$name.$layer];
$class = parse_res_name($name,$layer);
if(class_exists($class))
{
$model = new $class(basename($name));
}elseif(false === strpos($name,'/')){ // 自动加载公共模块下面的模型
if(!C('APP_USE_NAMESPACE')){
import('Common/'.$layer.'/'.$class);
}else{ $class = '\Common\'.$layer.'\'.$name.$layer;
} $model = class_exists($class)? new $class($name) : new ThinkModel($name);
}else {
ThinkLog::record('D方法实例化没找到模型类'.$class,ThinkLog::NOTICE); $model = new ThinkModel(basename($name));
} $_model[$name.$layer] = $model; return $model;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 抛出异常处理
* @param string $msg 异常消息
* @param integer $code 异常代码 默认为0
* @throws ThinkException
* @return void
*/function E($msg, $code=0) {
throw new ThinkException($msg, $code);
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 快速文件数据读取和保存 针对简单类型数据 字符串、数组
* @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 ('' !== $value) { if (is_null($value)) { // 删除缓存
if(false !== strpos($name,'*')){ return false; // TODO
}else{ unset($_cache[$name]); return ThinkStorage::unlink($filename,'F');
}
} else {
ThinkStorage::put($filename,serialize($value),'F'); // 缓存数据
$_cache[$name] = $value; return null;
}
} // 获取缓存数据
if (isset($_cache[$name]))
return $_cache[$name];
if (ThinkStorage::has($filename,'F')){
$value = unserialize(ThinkStorage::read($filename,'F'));
$_cache[$name] = $value;
} else { $value = false;
} return $value;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 记录和统计时间(微秒)和内存使用情况
* 使用方法:
* <code>
* G('begin'); // 记录开始标记位
* // ... 区间运行代码
* G('end'); // 记录结束标签位
* echo G('begin','end',6); // 统计区间运行时间 精确到小数后6位
* echo G('begin','end','m'); // 统计区间内存使用情况
* 如果end标记位没有定义,则会自动以当前作为标记位
* 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效
* </code>
* @param string $start 开始标签
* @param string $end 结束标签
* @param integer|string $dec 小数位或者m
* @return mixed
*/function G($start,$end='',$dec=4) {
static $_info = array(); static $_mem = array(); if(is_float($end)) { // 记录时间
$_info[$start] = $end;
}elseif(!empty($end)){ // 统计时间和内存使用
if(!isset($_info[$end])) $_info[$end] = microtime(TRUE);
if(MEMORY_LIMIT_ON && $dec=='m'){
if(!isset($_mem[$end])) $_mem[$end] = memory_get_usage();
return number_format(($_mem[$end]-$_mem[$start])/1024);
}else{ return number_format(($_info[$end]-$_info[$start]),$dec);
}
}else{ // 记录时间和内存使用
$_info[$start] = microtime(TRUE); if(MEMORY_LIMIT_ON) $_mem[$start] = memory_get_usage();
} return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 获取输入参数 支持过滤和默认值
* 使用方法:
* <code>
* I('id',0); 获取id参数 自动判断get或者post
* I('post.name','','htmlspecialchars'); 获取$_POST['name']
* I('get.'); 获取$_GET
* </code>
* @param string $name 变量的名称 支持指定类型
* @param mixed $default 不存在的时候默认值
* @param mixed $filter 参数过滤方法
* @param mixed $datas 要获取的额外数据源
* @return mixed
*/function I($name,$default='',$filter=null,$datas=null) {
static $_PUT = null; if(strpos($name,'/')){ // 指定修饰符
list($name,$type) = explode('/',$name,2);
}elseif(C('VAR_AUTO_STRING')){ // 默认强制转换为字符串
$type = 's';
} if(strpos($name,'.')) { // 指定参数来源
list($method,$name) = explode('.',$name,2);
}else{ // 默认为自动判断
$method = 'param';
} switch(strtolower($method)) { case 'get' :
$input =& $_GET; break; case 'post' :
$input =& $_POST; break; case 'put' :
if(is_null($_PUT)){
parse_str(file_get_contents('php://input'), $_PUT);
} $input = $_PUT;
break; case 'param' : switch($_SERVER['REQUEST_METHOD']) { case 'POST': $input = $_POST; break; case 'PUT': if(is_null($_PUT)){
parse_str(file_get_contents('php://input'), $_PUT);
} $input = $_PUT; break; default: $input = $_GET;
} break; case 'path' :
$input = array(); if(!empty($_SERVER['PATH_INFO'])){
$depr = C('URL_PATHINFO_DEPR'); $input = explode($depr,trim($_SERVER['PATH_INFO'],$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 =& $datas;
break; default: return null;
} if(''==$name) { // 获取全部变量
$data = $input; $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); if($filters) { if(is_string($filters)){ $filters = explode(',',$filters);
} foreach($filters as $filter){ $data = array_map_recursive($filter,$data); // 参数过滤
}
}
}elseif(isset($input[$name])) { // 取值操作
$data = $input[$name];
$filters = isset($filter)?$filter:C('DEFAULT_FILTER');
if($filters) {
if(is_string($filters)){ if(0 === strpos($filters,'/')){ if(1 !== preg_match($filters,(string)$data)){ // 支持正则验证
return isset($default) ? $default : null;
}
}else{ $filters = explode(',',$filters);
}
}elseif(is_int($filters)){ $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{ // 变量默认值
$data = isset($default)?$default:null;
}
is_array($data) && array_walk_recursive($data,'think_filter'); return $data;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 获取和设置语言定义(不区分大小写)
* @param string|array $name 语言变量
* @param mixed $value 语言值或者变量
* @return mixed
*/function L($name=null, $value=null) {
static $_lang = array(); // 空参数返回所有定义
if (empty($name)) return $_lang; // 判断语言获取(或设置)
// 若不存在,直接返回全大写$name
if (is_string($name)) { $name = strtoupper($name); if (is_null($value)){ return isset($_lang[$name]) ? $_lang[$name] : $name;
}elseif(is_array($value)){ // 支持变量
$replace = array_keys($value); foreach($replace as &$v){ $v = '{$'.$v.'}';
} return str_replace($replace,$value,isset($_lang[$name]) ? $_lang[$name] : $name);
} $_lang[$name] = $value; // 语言定义
return null;
} // 批量定义
if (is_array($name)) $_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER)); return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 实例化一个没有模型文件的Model
* @param string $name Model名称 支持指定基础模型 例如 MongoModel:User
* @param string $tablePrefix 表前缀
* @param mixed $connection 数据库连接信息
* @return ThinkModel
*/function M($name='', $tablePrefix='',$connection='') {
static $_model = array(); if(strpos($name,':')) { list($class,$name) = explode(':',$name);
}else{ $class = 'Think\Model';
} $guid = (is_array($connection)?implode('',$connection):$connection).$tablePrefix . $name . '_' . $class;
if (!isset($_model[$guid])) $_model[$guid] = new $class($name,$tablePrefix,$connection); return $_model[$guid];
}/**
* 设置和获取统计数据
* 使用方法:
* <code>
* N('db',1); // 记录数据库操作次数
* N('read',1); // 记录读取次数
* echo N('db'); // 获取当前页面数据库的所有操作次数
* echo N('read'); // 获取当前页面读取次数
* </code>
* @param string $key 标识位置
* @param integer $step 步进值
* @param boolean $save 是否保存结果
* @return mixed
*/function N($key, $step=0,$save=false) {
static $_num = array(); if (!isset($_num[$key])) { $_num[$key] = (false !== $save)? S('N_'.$key) : 0;
} if (empty($step)){ return $_num[$key];
}else{ $_num[$key] = $_num[$key] + (int)$step;
} if(false !== $save){ // 保存结果
S('N_'.$key,$_num[$key],$save);
} return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 远程调用控制器的操作方法 URL 参数格式 [资源://][模块/]控制器/操作
* @param string $url 调用地址
* @param string|array $vars 调用参数 支持字符串和数组
* @param string $layer 要调用的控制层名称
* @return mixed
*/function R($url,$vars=array(),$layer='') {
$info = pathinfo($url); $action = $info['basename']; $module = $info['dirname']; $class = A($module,$layer); if($class){
if(is_string($vars)) {
parse_str($vars,$vars);
} return call_user_func_array(array(&$class,$action.C('ACTION_SUFFIX')),$vars);
}else{ return false;
}
}/**
* 获取模版文件 格式 资源://模块@主题/控制器/操作
* @param string $template 模版资源地址
* @param string $layer 视图层(目录)名称
* @return string
*/function T($template='',$layer=''){
// 解析模版资源地址
if(false === strpos($template,'://')){ $template = 'http://'.str_replace(':', '/',$template);
} $info = parse_url($template); $file = $info['host'].(isset($info['path'])?$info['path']:'');
$module = isset($info['user'])?$info['user'].'/':MODULE_NAME.'/'; $extend = $info['scheme'];
$layer = $layer?$layer:C('DEFAULT_V_LAYER'); // 获取当前主题的模版路径
$auto = C('AUTOLOAD_NAMESPACE'); if($auto && isset($auto[$extend])){ // 扩展资源
$baseUrl = $auto[$extend].$module.$layer.'/';
}elseif(C('VIEW_PATH')){
// 改变模块视图目录
$baseUrl = C('VIEW_PATH');
}elseif(defined('TMPL_PATH')){
// 指定全局视图目录
$baseUrl = TMPL_PATH.$module;
}else{ $baseUrl = APP_PATH.$module.$layer.'/';
} // 获取主题
$theme = substr_count($file,'/')<2 ? C('DEFAULT_THEME') : ''; // 分析模板文件规则
$depr = C('TMPL_FILE_DEPR'); if('' == $file) { // 如果模板文件名为空 按照默认规则定位
$file = CONTROLLER_NAME . $depr . ACTION_NAME;
}elseif(false === strpos($file, '/')){ $file = CONTROLLER_NAME . $depr . $file;
}elseif('/' != $depr){ $file = substr_count($file,'/')>1 ? substr_replace($file,$depr,strrpos($file,'/'),1) : str_replace('/', $depr, $file);
} return $baseUrl.($theme?$theme.'/':'').$file.C('TMPL_TEMPLATE_SUFFIX');
}/**
* 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($url='',$vars='',$suffix=true,$domain=false) {
// 解析URL
$info = parse_url($url); $url = !empty($info['path'])?$info['path']:ACTION_NAME; if(isset($info['fragment'])) { // 解析锚点
$anchor = $info['fragment']; if(false !== strpos($anchor,'?')) { // 解析参数
list($anchor,$info['query']) = explode('?',$anchor,2);
}
if(false !== strpos($anchor,'@')) { // 解析域名
list($anchor,$host) = explode('@',$anchor, 2);
}
}elseif(false !== strpos($url,'@')) { // 解析域名
list($url,$host) = explode('@',$info['path'], 2);
} // 解析子域名
if(isset($host)) { $domain = $host.(strpos($host,'.')?'':strstr($_SERVER['HTTP_HOST'],'.'));
}elseif($domain===true){ $domain = $_SERVER['HTTP_HOST']; if(C('APP_SUB_DOMAIN_DEPLOY') ) { // 开启子域名部署
$domain = $domain=='localhost'?'localhost':'www'.strstr($_SERVER['HTTP_HOST'],'.'); // '子域名'=>array('模块[/控制器]');
foreach (C('APP_SUB_DOMAIN_RULES') as $key => $rule) { $rule = is_array($rule)?$rule[0]:$rule;
if(false === strpos($key,'*') && 0=== strpos($url,$rule)) { $domain = $key.strstr($domain,'.'); // 生成对应子域名
$url = substr_replace($url,'',0,strlen($rule)); break;
}
}
}
} // 解析参数
if(is_string($vars)) { // aaa=1&bbb=2 转换成数组
parse_str($vars,$vars);
}elseif(!is_array($vars)){ $vars = array();
} if(isset($info['query'])) { // 解析地址里面参数 合并到vars
parse_str($info['query'],$params); $vars = array_merge($params,$vars);
} // URL组装
$depr = C('URL_PATHINFO_DEPR'); $urlCase = C('URL_CASE_INSENSITIVE'); if($url) { if(0=== strpos($url,'/')) {// 定义路由
$route = true; $url = substr($url,1);
if('/' != $depr) {
$url = str_replace('/',$depr,$url);
}
}else{ if('/' != $depr) { // 安全替换
$url = str_replace('/',$depr,$url);
} // 解析模块、控制器和操作
$url = trim($url,$depr); $path = explode($depr,$url);
$var = array(); $varModule = C('VAR_MODULE');
$varController = C('VAR_CONTROLLER');
$varAction = C('VAR_ACTION');
$var[$varAction] = !empty($path)?array_pop($path):ACTION_NAME;
$var[$varController] = !empty($path)?array_pop($path):CONTROLLER_NAME;
if($maps = C('URL_ACTION_MAP')) {
if(isset($maps[strtolower($var[$varController])])) {
$maps = $maps[strtolower($var[$varController])];
if($action = array_search(strtolower($var[$varAction]),$maps)){
$var[$varAction] = $action;
}
}
} if($maps = C('URL_CONTROLLER_MAP')) { if($controller = array_search(strtolower($var[$varController]),$maps)){ $var[$varController] = $controller;
}
} if($urlCase) { $var[$varController] = parse_name($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转换
$url = __APP__.'?'.C('VAR_MODULE')."={$module}&".http_build_query(array_reverse($var));
if($urlCase){ $url = strtolower($url);
}
if(!empty($vars)) { $vars = http_build_query($vars); $url .= '&'.$vars;
}
}else{ // PATHINFO模式或者兼容URL模式
if(isset($route)) { $url = __APP__.'/'.rtrim($url,$depr);
}else{ $module = (defined('BIND_MODULE') && BIND_MODULE==$module )? '' : $module;
$url = __APP__.'/'.($module?$module.MODULE_PATHINFO_DEPR:'').implode($depr,array_reverse($var));
} if($urlCase){ $url = strtolower($url);
} if(!empty($vars)) { // 添加参数
foreach ($vars as $var => $val){ if('' !== trim($val)) $url .= $depr . $var . $depr . urlencode($val);
}
} if($suffix) { $suffix = $suffix===true?C('URL_HTML_SUFFIX'):$suffix;
if($pos = strpos($suffix, '|')){ $suffix = substr($suffix, 0, $pos);
} if($suffix && '/' != substr($url,-1)){ $url .= '.'.ltrim($suffix,'.');
}
}
} if(isset($anchor)){ $url .= '#'.$anchor;
} if($domain) { $url = (is_ssl()?'https://':'http://').$domain.$url;
} return $url;
}/**
* 渲染输出Widget
* @param string $name Widget名称
* @param array $data 传入的参数
* @return void
*/function W($name, $data=array()) {
return R($name,$data,'Widget');
}/**
* 缓存管理
* @param mixed $name 缓存名称,如果为数组表示进行缓存设置
* @param mixed $value 缓存值
* @param mixed $options 缓存参数
* @return mixed
*/function S($name,$value='',$options=null) {
static $cache = ''; if(is_array($options)){ // 缓存操作的同时初始化
$type = isset($options['type'])?$options['type']:''; $cache = ThinkCache::getInstance($type,$options);
}elseif(is_array($name)) { // 缓存初始化
$type = isset($name['type'])?$name['type']:''; $cache = ThinkCache::getInstance($type,$name); return $cache;
}elseif(empty($cache)) { // 自动初始化
$cache = ThinkCache::getInstance();
} if(''=== $value){ // 获取缓存
return $cache->get($name);
}elseif(is_null($value)) { // 删除缓存
return $cache->rm($name);
}else { // 缓存数据
if(is_array($options)) { $expire = isset($options['expire'])?$options['expire']:NULL;
}else{ $expire = is_numeric($options)?$options:NULL;
} return $cache->set($name, $value, $expire);
}
}?>
<?php/////////////////////////////////////////////////////////A///////////////////////////////////////////////////////////////**
* 实例化多层控制器 格式:[资源://][模块/]控制器
* @param string $name 资源地址
* @param string $layer 控制层名称
* @param integer $level 控制器层次
* @return ThinkController|false
*/function A($name,$layer='',$level=0) {
static $_action = array(); $layer = $layer? : C('DEFAULT_C_LAYER'); $level = $level? : ($layer == C('DEFAULT_C_LAYER')?C('CONTROLLER_LEVEL'):1);
if(isset($_action[$name.$layer])) return $_action[$name.$layer];
$class = parse_res_name($name,$layer,$level);
if(class_exists($class)) {
$action = new $class(); $_action[$name.$layer] = $action; return $action;
}else { return false;
}
}////////////////////////////////////////////////////////B////////////////////////////////////////////////////////////////**
* 执行某个行为
* @param string $name 行为名称
* @param string $tag 标签名称(行为类无需传入)
* @param Mixed $params 传入的参数
* @return void
*/function B($name, $tag='',&$params=NULL) {
if(''==$tag){ $name .= 'Behavior';
} return ThinkHook::exec($name,$tag,$params);
}////////////////////////////////////////////////////////C////////////////////////////////////////////////////////////////**
* 获取和设置配置参数 支持批量定义
* @param string|array $name 配置变量
* @param mixed $value 配置值
* @param mixed $default 默认值
* @return mixed
*/function C($name=null, $value=null,$default=null) {
static $_config = array(); // 无参数时获取所有
if (empty($name)) { return $_config;
} // 优先执行设置获取或赋值
if (is_string($name)) { if (!strpos($name, '.')) { $name = strtoupper($name);
if (is_null($value)) return isset($_config[$name]) ? $_config[$name] : $default;
$_config[$name] = $value; return null;
} // 二维数组设置和获取支持
$name = explode('.', $name); $name[0] = strtoupper($name[0]); if (is_null($value))
return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : $default;
$_config[$name[0]][$name[1]] = $value;
return null;
} // 批量设置
if (is_array($name)){ $_config = array_merge($_config, array_change_key_case($name,CASE_UPPER)); return null;
} return null; // 避免非法参数}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 实例化模型类 格式 [资源://][模块/]模型
* @param string $name 资源地址
* @param string $layer 模型层名称
* @return ThinkModel
*/function D($name='',$layer='') {
if(empty($name)) return new ThinkModel; static $_model = array(); $layer = $layer? : C('DEFAULT_M_LAYER');
if(isset($_model[$name.$layer])) return $_model[$name.$layer]; $class = parse_res_name($name,$layer);
if(class_exists($class)) { $model = new $class(basename($name));
}elseif(false === strpos($name,'/')){ // 自动加载公共模块下面的模型
if(!C('APP_USE_NAMESPACE')){
import('Common/'.$layer.'/'.$class);
}else{ $class = '\Common\'.$layer.'\'.$name.$layer;
} $model = class_exists($class)? new $class($name) : new ThinkModel($name);
}else {
ThinkLog::record('D方法实例化没找到模型类'.$class,ThinkLog::NOTICE); $model = new ThinkModel(basename($name));
} $_model[$name.$layer] = $model; return $model;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 抛出异常处理
* @param string $msg 异常消息
* @param integer $code 异常代码 默认为0
* @throws ThinkException
* @return void
*/function E($msg, $code=0) {
throw new ThinkException($msg, $code);
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 快速文件数据读取和保存 针对简单类型数据 字符串、数组
* @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 ('' !== $value) { if (is_null($value)) { // 删除缓存
if(false !== strpos($name,'*')){ return false; // TODO
}else{ unset($_cache[$name]); return ThinkStorage::unlink($filename,'F');
}
} else {
ThinkStorage::put($filename,serialize($value),'F'); // 缓存数据
$_cache[$name] = $value; return null;
}
} // 获取缓存数据
if (isset($_cache[$name])) return $_cache[$name];
if (ThinkStorage::has($filename,'F')){ $value = unserialize(ThinkStorage::read($filename,'F')); $_cache[$name] = $value;
} else { $value = false;
} return $value;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 记录和统计时间(微秒)和内存使用情况
* 使用方法:
* <code>
* G('begin'); // 记录开始标记位
* // ... 区间运行代码
* G('end'); // 记录结束标签位
* echo G('begin','end',6); // 统计区间运行时间 精确到小数后6位
* echo G('begin','end','m'); // 统计区间内存使用情况
* 如果end标记位没有定义,则会自动以当前作为标记位
* 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效
* </code>
* @param string $start 开始标签
* @param string $end 结束标签
* @param integer|string $dec 小数位或者m
* @return mixed
*/function G($start,$end='',$dec=4) {
static $_info = array(); static $_mem = array(); if(is_float($end)) { // 记录时间
$_info[$start] = $end;
}elseif(!empty($end)){ // 统计时间和内存使用
if(!isset($_info[$end])) $_info[$end] = microtime(TRUE);
if(MEMORY_LIMIT_ON && $dec=='m'){
if(!isset($_mem[$end])) $_mem[$end] = memory_get_usage(); return number_format(($_mem[$end]-$_mem[$start])/1024);
}else{ return number_format(($_info[$end]-$_info[$start]),$dec);
}
}else{ // 记录时间和内存使用
$_info[$start] = microtime(TRUE); if(MEMORY_LIMIT_ON) $_mem[$start] = memory_get_usage();
} return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 获取输入参数 支持过滤和默认值
* 使用方法:
* <code>
* I('id',0); 获取id参数 自动判断get或者post
* I('post.name','','htmlspecialchars'); 获取$_POST['name']
* I('get.'); 获取$_GET
* </code>
* @param string $name 变量的名称 支持指定类型
* @param mixed $default 不存在的时候默认值
* @param mixed $filter 参数过滤方法
* @param mixed $datas 要获取的额外数据源
* @return mixed
*/function I($name,$default='',$filter=null,$datas=null) {
static $_PUT = null; if(strpos($name,'/')){ // 指定修饰符
list($name,$type) = explode('/',$name,2);
}elseif(C('VAR_AUTO_STRING')){ // 默认强制转换为字符串
$type = 's';
} if(strpos($name,'.')) { // 指定参数来源
list($method,$name) = explode('.',$name,2);
}else{ // 默认为自动判断
$method = 'param';
} switch(strtolower($method)) { case 'get' :
$input =& $_GET; break; case 'post' :
$input =& $_POST; break; case 'put' :
if(is_null($_PUT)){
parse_str(file_get_contents('php://input'), $_PUT);
} $input = $_PUT;
break; case 'param' : switch($_SERVER['REQUEST_METHOD']) { case 'POST': $input = $_POST; break; case 'PUT': if(is_null($_PUT)){
parse_str(file_get_contents('php://input'), $_PUT);
} $input = $_PUT; break; default: $input = $_GET;
} break; case 'path' :
$input = array();
if(!empty($_SERVER['PATH_INFO'])){
$depr = C('URL_PATHINFO_DEPR'); $input = explode($depr,trim($_SERVER['PATH_INFO'],$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 =& $datas;
break; default: return null;
} if(''==$name) { // 获取全部变量
$data = $input; $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); if($filters) { if(is_string($filters)){ $filters = explode(',',$filters);
} foreach($filters as $filter){ $data = array_map_recursive($filter,$data); // 参数过滤
}
}
}elseif(isset($input[$name])) { // 取值操作
$data = $input[$name]; $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); if($filters) {
if(is_string($filters)){ if(0 === strpos($filters,'/')){ if(1 !== preg_match($filters,(string)$data)){ // 支持正则验证
return isset($default) ? $default : null;
}
}else{ $filters = explode(',',$filters);
}
}elseif(is_int($filters)){ $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{ // 变量默认值
$data = isset($default)?$default:null;
}
is_array($data) && array_walk_recursive($data,'think_filter'); return $data;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 获取和设置语言定义(不区分大小写)
* @param string|array $name 语言变量
* @param mixed $value 语言值或者变量
* @return mixed
*/function L($name=null, $value=null) {
static $_lang = array(); // 空参数返回所有定义
if (empty($name)) return $_lang; // 判断语言获取(或设置)
// 若不存在,直接返回全大写$name
if (is_string($name)) { $name = strtoupper($name); if (is_null($value)){ return isset($_lang[$name]) ? $_lang[$name] : $name;
}elseif(is_array($value)){ // 支持变量
$replace = array_keys($value); foreach($replace as &$v){ $v = '{$'.$v.'}';
} return str_replace($replace,$value,isset($_lang[$name]) ? $_lang[$name] : $name);
} $_lang[$name] = $value; // 语言定义
return null;
} // 批量定义
if (is_array($name)) $_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER)); return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 实例化一个没有模型文件的Model
* @param string $name Model名称 支持指定基础模型 例如 MongoModel:User
* @param string $tablePrefix 表前缀
* @param mixed $connection 数据库连接信息
* @return ThinkModel
*/function M($name='', $tablePrefix='',$connection='') {
static $_model = array(); if(strpos($name,':')) { list($class,$name) = explode(':',$name);
}else{ $class = 'Think\Model';
} $guid = (is_array($connection)?implode('',$connection):$connection).$tablePrefix . $name . '_' . $class;
if (!isset($_model[$guid])) $_model[$guid] = new $class($name,$tablePrefix,$connection); return $_model[$guid];
}/**
* 设置和获取统计数据
* 使用方法:
* <code>
* N('db',1); // 记录数据库操作次数
* N('read',1); // 记录读取次数
* echo N('db'); // 获取当前页面数据库的所有操作次数
* echo N('read'); // 获取当前页面读取次数
* </code>
* @param string $key 标识位置
* @param integer $step 步进值
* @param boolean $save 是否保存结果
* @return mixed
*/function N($key, $step=0,$save=false) {
static $_num = array(); if (!isset($_num[$key])) { $_num[$key] = (false !== $save)? S('N_'.$key) : 0;
} if (empty($step)){ return $_num[$key];
}else{ $_num[$key] = $_num[$key] + (int)$step;
} if(false !== $save){ // 保存结果
S('N_'.$key,$_num[$key],$save);
} return null;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**
* 远程调用控制器的操作方法 URL 参数格式 [资源://][模块/]控制器/操作
* @param string $url 调用地址
* @param string|array $vars 调用参数 支持字符串和数组
* @param string $layer 要调用的控制层名称
* @return mixed
*/function R($url,$vars=array(),$layer='') {
$info = pathinfo($url); $action = $info['basename']; $module = $info['dirname']; $class = A($module,$layer);
if($class){ if(is_string($vars)) {
parse_str($vars,$vars);
} return call_user_func_array(array(&$class,$action.C('ACTION_SUFFIX')),$vars);
}else{ return false;
}
}/**
* 获取模版文件 格式 资源://模块@主题/控制器/操作
* @param string $template 模版资源地址
* @param string $layer 视图层(目录)名称
* @return string
*/function T($template='',$layer=''){
// 解析模版资源地址
if(false === strpos($template,'://')){ $template = 'http://'.str_replace(':', '/',$template);
} $info = parse_url($template); $file = $info['host'].(isset($info['path'])?$info['path']:'');
$module = isset($info['user'])?$info['user'].'/':MODULE_NAME.'/'; $extend = $info['scheme'];
$layer = $layer?$layer:C('DEFAULT_V_LAYER'); // 获取当前主题的模版路径
$auto = C('AUTOLOAD_NAMESPACE'); if($auto && isset($auto[$extend])){ // 扩展资源
$baseUrl = $auto[$extend].$module.$layer.'/';
}elseif(C('VIEW_PATH')){
// 改变模块视图目录
$baseUrl = C('VIEW_PATH');
}elseif(defined('TMPL_PATH')){
// 指定全局视图目录
$baseUrl = TMPL_PATH.$module;
}else{ $baseUrl = APP_PATH.$module.$layer.'/';
} // 获取主题
$theme = substr_count($file,'/')<2 ? C('DEFAULT_THEME') : ''; // 分析模板文件规则
$depr = C('TMPL_FILE_DEPR'); if('' == $file) { // 如果模板文件名为空 按照默认规则定位
$file = CONTROLLER_NAME . $depr . ACTION_NAME;
}elseif(false === strpos($file, '/')){ $file = CONTROLLER_NAME . $depr . $file;
}elseif('/' != $depr){ $file = substr_count($file,'/')>1 ? substr_replace($file,$depr,strrpos($file,'/'),1) : str_replace('/', $depr, $file);
} return $baseUrl.($theme?$theme.'/':'').$file.C('TMPL_TEMPLATE_SUFFIX');
}/**
* 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($url='',$vars='',$suffix=true,$domain=false) {
// 解析URL
$info = parse_url($url); $url = !empty($info['path'])?$info['path']:ACTION_NAME; if(isset($info['fragment'])) { // 解析锚点
$anchor = $info['fragment']; if(false !== strpos($anchor,'?')) { // 解析参数
list($anchor,$info['query']) = explode('?',$anchor,2);
}
if(false !== strpos($anchor,'@')) { // 解析域名
list($anchor,$host) = explode('@',$anchor, 2);
}
}elseif(false !== strpos($url,'@')) { // 解析域名
list($url,$host) = explode('@',$info['path'], 2);
} // 解析子域名
if(isset($host)) { $domain = $host.(strpos($host,'.')?'':strstr($_SERVER['HTTP_HOST'],'.'));
}elseif($domain===true){ $domain = $_SERVER['HTTP_HOST']; if(C('APP_SUB_DOMAIN_DEPLOY') ) { // 开启子域名部署
$domain = $domain=='localhost'?'localhost':'www'.strstr($_SERVER['HTTP_HOST'],'.'); // '子域名'=>array('模块[/控制器]');
foreach (C('APP_SUB_DOMAIN_RULES') as $key => $rule) { $rule = is_array($rule)?$rule[0]:$rule;
if(false === strpos($key,'*') && 0=== strpos($url,$rule)) { $domain = $key.strstr($domain,'.'); // 生成对应子域名
$url = substr_replace($url,'',0,strlen($rule)); break;
}
}
}
} // 解析参数
if(is_string($vars)) { // aaa=1&bbb=2 转换成数组
parse_str($vars,$vars);
}elseif(!is_array($vars)){ $vars = array();
} if(isset($info['query'])) { // 解析地址里面参数 合并到vars
parse_str($info['query'],$params); $vars = array_merge($params,$vars);
} // URL组装
$depr = C('URL_PATHINFO_DEPR'); $urlCase = C('URL_CASE_INSENSITIVE'); if($url) { if(0=== strpos($url,'/')) {// 定义路由
$route = true; $url = substr($url,1);
if('/' != $depr) { $url = str_replace('/',$depr,$url);
}
}else{ if('/' != $depr) { // 安全替换
$url = str_replace('/',$depr,$url);
} // 解析模块、控制器和操作
$url = trim($url,$depr); $path = explode($depr,$url); $var = array();
$varModule = C('VAR_MODULE'); $varController = C('VAR_CONTROLLER');
$varAction = C('VAR_ACTION'); $var[$varAction] = !empty($path)?array_pop($path):ACTION_NAME;
$var[$varController] = !empty($path)?array_pop($path):CONTROLLER_NAME;
if($maps = C('URL_ACTION_MAP')) {
if(isset($maps[strtolower($var[$varController])])) {
$maps = $maps[strtolower($var[$varController])];
if($action = array_search(strtolower($var[$varAction]),$maps)){ $var[$varAction] = $action;
}
}
} if($maps = C('URL_CONTROLLER_MAP')) { if($controller = array_search(strtolower($var[$varController]),$maps)){ $var[$varController] = $controller;
}
} if($urlCase) { $var[$varController] = parse_name($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转换
$url = __APP__.'?'.C('VAR_MODULE')."={$module}&".http_build_query(array_reverse($var));
if($urlCase){ $url = strtolower($url);
}
if(!empty($vars)) { $vars = http_build_query($vars); $url .= '&'.$vars;
}
}else{ // PATHINFO模式或者兼容URL模式
if(isset($route)) { $url = __APP__.'/'.rtrim($url,$depr);
}else{ $module = (defined('BIND_MODULE') && BIND_MODULE==$module )? '' : $module;
$url = __APP__.'/'.($module?$module.MODULE_PATHINFO_DEPR:'').implode($depr,array_reverse($var));
} if($urlCase){ $url = strtolower($url);
} if(!empty($vars)) { // 添加参数
foreach ($vars as $var => $val){ if('' !== trim($val)) $url .= $depr . $var . $depr . urlencode($val);
}
} if($suffix) { $suffix = $suffix===true?C('URL_HTML_SUFFIX'):$suffix;
if($pos = strpos($suffix, '|')){ $suffix = substr($suffix, 0, $pos);
} if($suffix && '/' != substr($url,-1)){ $url .= '.'.ltrim($suffix,'.');
}
}
} if(isset($anchor)){ $url .= '#'.$anchor;
} if($domain) { $url = (is_ssl()?'https://':'http://').$domain.$url;
} return $url;
}/**
* 渲染输出Widget
* @param string $name Widget名称
* @param array $data 传入的参数
* @return void
*/function W($name, $data=array()) {
return R($name,$data,'Widget');
}/**
* 缓存管理
* @param mixed $name 缓存名称,如果为数组表示进行缓存设置
* @param mixed $value 缓存值
* @param mixed $options 缓存参数
* @return mixed
*/function S($name,$value='',$options=null) {
static $cache = ''; if(is_array($options)){ // 缓存操作的同时初始化
$type = isset($options['type'])?$options['type']:''; $cache = ThinkCache::getInstance($type,$options);
}elseif(is_array($name)) { // 缓存初始化
$type = isset($name['type'])?$name['type']:''; $cache = ThinkCache::getInstance($type,$name); return $cache;
}elseif(empty($cache)) { // 自动初始化
$cache = ThinkCache::getInstance();
} if(''=== $value){ // 获取缓存
return $cache->get($name);
}elseif(is_null($value)) { // 删除缓存
return $cache->rm($name);
}else { // 缓存数据
if(is_array($options)) { $expire = isset($options['expire'])?$options['expire']:NULL;
}else{ $expire = is_numeric($options)?$options:NULL;
} return $cache->set($name, $value, $expire);
}
}?>相关推荐:
以上就是ThinkPHP字母函数的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号