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 相关文章推荐
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
Jan 15 PHP
php addslashes 函数详细分析说明
Jun 23 PHP
Apache下禁止php文件被直接访问的解决方案
Apr 25 PHP
phpExcel中文帮助手册之常用功能指南
Aug 18 PHP
php中字符串和正则表达式详解
Oct 23 PHP
PHP获取服务器端信息的方法
Nov 28 PHP
PHP多线程编程之管道通信实例分析
Mar 07 PHP
php实现递归的三种基本方式
Jul 04 PHP
PHP语法小结之基础和变量
Nov 22 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
PHP 函数学习简单小结
2010/07/08 PHP
PHP中创建图像并绘制文字的例子
2014/11/19 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
vant实现购物车功能
2020/06/29 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
深入浅析Python中的迭代器
2019/06/04 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
python利用线程实现多任务
2020/09/18 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
python如何快速拼接字符串
2020/10/28 Python
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
护理专业应届毕业生推荐信
2013/11/15 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
导游词之南京中山陵
2019/11/27 职场文书
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android