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 相关文章推荐
第十二节--类的自动加载
Nov 16 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
PHP面向对象精要总结
Nov 07 PHP
PHP采用get获取url汉字出现乱码的解决方法
Nov 13 PHP
浅谈PHP中Stream(流)
Jun 08 PHP
在WordPress中实现发送http请求的相关函数解析
Dec 29 PHP
php使用文本统计访问量的方法
May 12 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
May 20 PHP
PHP批量删除jQuery操作
Jul 23 PHP
PHP实现简易计算器功能
Aug 28 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 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
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
PR值查询 | PageRank 查询
2006/12/20 PHP
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
PHP令牌 Token改进版
2008/07/18 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
PHP 日志缩略名的创建函数代码
2010/05/26 PHP
php在文件指定行中写入代码的方法
2012/05/23 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
python删除过期文件的方法
2015/05/29 Python
python利用datetime模块计算时间差
2015/08/04 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
前台文员岗位职责
2013/12/28 职场文书
开票员岗位职责
2015/02/12 职场文书
英语辞职信范文
2015/02/28 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android
python实现层次聚类的方法
2021/11/01 Python
springboot中的pom文件 project报错问题
2022/01/18 Java/Android