ThinkPHP中Common/common.php文件常用函数功能分析


Posted in PHP onMay 20, 2016

本文实例分析了ThinkPHP/Common/common.php文件常用函数功能。分享给大家供大家参考,具体如下:

/**
 * 获取和设置配置参数 支持批量定义
 * @param string|array $name 配置变量
 * @param mixed $value 配置值
 * @return mixed
 */
function C($name=null, $value=null) {
  static $_config = array();
  // 无参数时获取所有
  if (empty($name)) {
    if(!empty($value) && $array = cache('c_'.$value)) {
      //array_change_key_case():将数组中的所有键名改为全小写或大写,默认会改为全小写
      $_config = array_merge($_config, array_change_key_case($array));
    }
    return $_config;
  }
  // 优先执行设置获取或赋值,如果参数2为空,则为获取配置配置变量的值的情况;如果参数2不为空,则是为配置变量设置值的情况
  if (is_string($name)) {//给配置变量设置值或者获取配置变量的值
    if (!strpos($name, '.')) {//如果配置变量名中没有".",则执行下面代码
      $name = strtolower($name);//将配置变量名转化为小写
      if (is_null($value))
        return isset($_config[$name]) ? $_config[$name] : null;//获取配置变量值的情况,返回配置变量的值
      $_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]] : null;//获取值的情况
    $_config[$name[0]][$name[1]] = $value;//赋值的情况
    return;
  }
  // 批量设置
  if (is_array($name)){//批量设置值
    //array_change_key_case():将数组中的所有键名改为全小写或大写,默认会改为全小写,注意:只是将键名改为小写哦
    $_config = array_merge($_config, array_change_key_case($name));
    if(!empty($value)) {// 保存配置值
      cache('c_'.$value,$_config);
    }
    return;
  }
  return null; // 避免非法参数
}
/**
 * 处理标签扩展,如: 项目开始标签的调用,tag('app_begin');
 * @param string $tag 标签名称
 * @param mixed $params 传入参数
 * @return mixed
 */
function tag($tag, &$params=NULL) {
  // 系统或框架标签扩展
  // C('extends', include THINK_PATH.'Conf/tags.php');//这个文件很重要
  $extends  = C('extends.' . $tag);//$_config['extends'][app_init]
  // 应用或项目标签扩展
  // C('tags', include CONF_PATH.'tags.php'); //项目中也可以编写自己的tags.php文件
  $tags    = C('tags.' . $tag);//$_config['tags'][app_init]
  if (!empty($tags)) {//如果$tags不为空
    if(empty($tags['_overlay']) && !empty($extends)) { // 合并扩展
      $tags = array_unique(array_merge($extends,$tags));
    }elseif(isset($tags['_overlay'])){ // 通过设置 '_overlay'=>1 覆盖系统标签
      unset($tags['_overlay']);
    }
  }elseif(!empty($extends)) {
    $tags = $extends;
  }
  if($tags) {
    if(APP_DEBUG) {
      G($tag.'Start');
      trace('[ '.$tag.' ] --START--','','INFO');
    }
    // 执行扩展
    foreach ($tags as $key=>$name) {
      if(!is_int($key)) { // 指定行为类的完整路径 用于模式扩展
        $name  = $key;
      }
      //创建行为类对象,如:$class=$name.'Behavior';$behavior  = new $class();//创建一个行为类对象
      B($name, $params);//执行某个行为,参数1-行为名称  参数2-传入的参数
    }
    if(APP_DEBUG) { // 记录行为的执行日志
      trace('[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]','','INFO');
    }
  }else{ // 未执行任何行为 返回false
    return false;
  }
}
/**
 * 执行某个行为
 * @param string $name 行为名称
 * @param Mixed $params 传人的参数
 * @return void
 */
function B($name, &$params=NULL) {
  //行为类在Think.class.php文件中的autoload($class)函数中自动加载
  $class   = $name.'Behavior';//行为类的名称
  G('behaviorStart');
  $behavior  = new $class();//创建一个行为类对象
  $behavior->run($params);//给当前行为类对象传递参数
  if(APP_DEBUG) { // 记录行为的执行日志
    trace('Run '.$name.' Behavior [ RunTime:'.G('behaviorStart','behaviorEnd',6).'s ]','','INFO');
  }
}

注意:行为类、模型类、控制器类 都是在Think.class.php文件中的autoload函数中自动加载的:

/**
* 系统自动加载ThinkPHP类库
* 并且支持配置自动加载路径
* @param string $class 对象类名
* @return void
*/
//行为类、模型类、控制器类 都是通过autoload函数自动加载的
public static function autoload($class) {
    // 检查是否存在别名定义
    if(alias_import($class)) return ;
    //行为类都是通过此函数自动加载的
    if(substr($class,-8)=='Behavior') { // 加载行为
      if(require_cache(CORE_PATH.'Behavior/'.$class.'.class.php')
        || require_cache(EXTEND_PATH.'Behavior/'.$class.'.class.php')
        || require_cache(LIB_PATH.'Behavior/'.$class.'.class.php')
        || (defined('MODE_NAME') && require_cache(MODE_PATH.ucwords(MODE_NAME).'/Behavior/'.$class.'.class.php'))) {
        return ;
      }
    }elseif(substr($class,-5)=='Model'){ // 加载模型
      if((defined('GROUP_NAME') && require_cache(LIB_PATH.'Model/'.GROUP_NAME.'/'.$class.'.class.php'))
        || require_cache(LIB_PATH.'Model/'.$class.'.class.php')
        || require_cache(EXTEND_PATH.'Model/'.$class.'.class.php') ) {
        return ;
      }
    }elseif(substr($class,-6)=='Action'){ // 加载控制器
      if((defined('GROUP_NAME') && require_cache(LIB_PATH.'Action/'.GROUP_NAME.'/'.$class.'.class.php'))
        || require_cache(LIB_PATH.'Action/'.$class.'.class.php')
        || require_cache(EXTEND_PATH.'Action/'.$class.'.class.php') ) {
        return ;
      }
    }
    // 根据自动加载路径设置进行尝试搜索
    $paths =  explode(',',C('APP_AUTOLOAD_PATH'));
    foreach ($paths as $path){
      if(import($path.'.'.$class))
        // 如果加载类成功则返回
        return ;
    }
}

PHP 相关文章推荐
php中的时间处理
Oct 09 PHP
paypal即时到账php实现代码
Nov 28 PHP
深入PHP数据缓存的使用说明
May 10 PHP
php基于mcrypt的加密解密实例
Oct 27 PHP
PHP.ini安全配置检测工具pcc简单介绍
Jul 02 PHP
PHP安装threads多线程扩展基础教程
Nov 17 PHP
php中使用GD库做验证码
Mar 31 PHP
PHP 验证身份证是否合法的函数
Feb 09 PHP
php中请求url的五种方法总结
Jul 13 PHP
php从数据库读取数据,并以json格式返回数据的方法
Aug 21 PHP
Laravel框架实现的使用smtp发送邮件功能示例
Mar 12 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 #PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 #PHP
ThinkPHP使用Ueditor的方法详解
May 20 #PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 #PHP
thinkphp3.x中session方法的用法分析
May 20 #PHP
PHP编写登录验证码功能 附调用方法
May 19 #PHP
一段实用的php验证码函数
May 19 #PHP
You might like
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
php使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
2015/12/21 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
PHP strripos函数用法总结
2019/02/11 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
Python日志模块logging简介
2015/04/13 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
python如何调用java类
2020/07/05 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
酒店门卫岗位职责
2013/12/29 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
班主任工作实习计划
2015/01/16 职场文书
订货会邀请函
2015/01/31 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
导游词之吉林吉塔
2019/11/11 职场文书