ThinkPHP 3.2 大写字母函数封装方法实例

/**
* @desc C方法
* @param null $name
* @param null $value
* @param null $default
* @return array|mixed|null|void
*/
public function C($name=null, $value=null,$default=null) {
static $_config = array();
// 无参数时获取所有
if (empty($name)) {
return $_config;
}
// 优先执行设置获取或赋值
if (is_string($name)) {
if (!strpos($name, '.')) {
$name = strtolower($name);
if (is_null($value))
return isset($_config[$name]) ? $_config[$name] : $default;
$_config[$name] = $value;
return;
}
// 二维数组设置和获取支持
$name = explode('.', $name);
$name[0] = strtolower($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;
}
// 批量设置
if (is_array($name)){
$_config = array_merge($_config, array_change_key_case($name));
return;
}
return null; // 避免非法参数
}
/**
* @desc G方法
* @param $start
* @param string $end
* @param int $dec
* @return string
*/

public 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();
}
}

/**
* @desc L方法
* @param null $name
* @param null $value
* @return array|mixed|string|void
*/
public 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;
$_lang[$name] = $value; // 语言定义
return;
}
// 批量定义
if (is_array($name))
$_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER));
return;
}

/**
* @desc T方法
* @param string $template
* @param string $layer
* @return string
*/
public 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').$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){
if(substr_count($file,'/')>1){
$file = substr_replace($file,$depr,strrpos($file,'/'),1);
}else{
$file = str_replace('/', $depr, $file);
}
}
return $baseUrl.($theme?$theme.'/':'').$file.C('TMPL_TEMPLATE_SUFFIX');
}

 /**
* @desc I方法
* @param $name
* @param string $default
* @param null $filter
* @return array|mixed|null|string
*/
public function I($name,$default='',$filter=null) {
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' : parse_str(file_get_contents('php://input'), $input);break;
case 'param' :
switch($_SERVER['REQUEST_METHOD']) {
case 'POST':
$input = $_POST;
break;
case 'PUT':
parse_str(file_get_contents('php://input'), $input);
break;
default:
$input = $_GET;
}
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;
default:
return NULL;
}
if(empty($name)) { // 获取全部变量
$data = $input;
array_walk_recursive($data,'filter_exp');
$filters = isset($filter)?$filter:C('DEFAULT_FILTER');
if($filters) {
$filters = explode(',',$filters);
foreach($filters as $filter){
$data = array_map_recursive($filter,$data); // 参数过滤
}
}
}elseif(isset($input[$name])) { // 取值操作
$data = $input[$name];
is_array($data) && array_walk_recursive($data,'filter_exp');
$filters = isset($filter)?$filter:C('DEFAULT_FILTER');
if($filters) {
$filters = explode(',',$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;
}
}
}
}
}else{ // 变量默认值
$data = isset($default)?$default:NULL;
}
return $data;
}

function array_map_recursive($filter, $data) {
$result = array();
foreach ($data as $key => $val) {
$result[$key] = is_array($val)
? array_map_recursive($filter, $val)
: call_user_func($filter, $val);
}
return $result;
}

/**
* @desc N方法
* @param $key
* @param int $step
* @param bool $save
* @return mixed
*/
public 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);
}
}

/**
* @desc D方法
* @param string $name
* @param string $layer
* @return mixed|Think\Model
*/
public function D($name='',$layer='') {
if(empty($name)) return new Think\Model;
static $_model = array();
$layer = $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,'/')){
// 自动加载公共模块下面的模型
$class = '\\Common\\'.$layer.'\\'.$name.$layer;
$model = class_exists($class)? new $class($name) : new Think\Model($name);
}else {
Think\Log::record('D方法实例化没找到模型类'.$class,Think\Log::NOTICE);
$model = new Think\Model(basename($name));
}
$_model[$name.$layer] = $model;
return $model;
}

 /**
* @desc M方法
* @param string $name
* @param string $tablePrefix
* @param string $connection
* @return mixed
*/
public 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];
}

/**
* @desc A方法
* @param $name
* @param string $layer
* @param string $level
* @return bool|mixed
*/
public function A($name,$layer='',$level='') {
static $_action = array();
$layer = $layer? $layer : C('DEFAULT_C_LAYER');
$level = $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;
}
}

/**
* @desc R方法
* @param $url
* @param array $vars
* @param string $layer
* @return bool|mixed
*/
public 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;
}
}

/**
* @desc B方法
* @param $name
* @param null $params
*/
public function B($name, &$params=NULL) {
if(strpos($name,'/')){
list($name,$tag) = explode('/',$name);
}else{
$tag = 'run';
}
return \Think\Hook::exec($name,$tag,$params);
}

 /**
* @desc U方法
* @param string $url
* @param string $vars
* @param bool $suffix
* @param bool $domain
* @return bool|mixed|string
*/
public 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] = array_pop($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') ? '' : $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;
}

/**
* @desc W方法
* @param $name
* @param array $data
* @return mixed
*/
public function W($name, $data=array()) {
return R($name,$data,'Widget');
}

/**
* @desc S方法
* @param $name
* @param string $value
* @param null $options
* @return string
*/
public function S($name,$value='',$options=null) {
static $cache = '';
if(is_array($options) && empty($cache)){
// 缓存操作的同时初始化
$type = isset($options['type'])?$options['type']:'';
$cache = Think\Cache::getInstance($type,$options);
}elseif(is_array($name)) { // 缓存初始化
$type = isset($name['type'])?$name['type']:'';
$cache = Think\Cache::getInstance($type,$name);
return $cache;
}elseif(empty($cache)) { // 自动初始化
$cache = Think\Cache::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);
}
}

 /**
* @desc F方法
* @param $name
* @param string $value
* @param string $path
* @return bool|mixed|string|void
*/
public 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 Think\Storage::unlink($filename,'F');
}
} else {
Think\Storage::put($filename,serialize($value),'F');
// 缓存数据
$_cache[$name] = $value;
return ;
}
}
// 获取缓存数据
if (isset($_cache[$name]))
return $_cache[$name];
if (Think\Storage::has($filename,'F')){
$value = unserialize(Think\Storage::read($filename,'F'));
$_cache[$name] = $value;
} else {
$value = false;
}
return $value;
}

 /**
* @desc E方法
* @param $msg
* @param int $code
*/
public function E($msg, $code=0) {
throw new Think\Exception($msg, $code);
}

猜你喜欢

转载自www.cnblogs.com/ws1992/p/9154807.html