SugarCRM源码分析之SugarConfig
2016-01-11 14:19
169 查看
SugarCRM的配置文件在项目目录/config.php和config_override.php中,其中config_override.php可以替换config.php中的配置。解析配置文件就是在SugarConfig和SugarArray两个类进行的。
在./include/entryPoint.php引入require_once 'include/SugarObjects/SugarConfig.php',然后在./include/utils/autoloader.php中实例化$config = SugarConfig::getInstance(),如获取$config->get('developerMode'),接下来看看代码流程。【此步骤是以入口流程中进行的,即index.php--->entryPoint.php--->autoloader.php】
看完代码后,可以了解,获取某个配置文件的值可以使用$config->get('developerMode');获取配置文件内多维数组的,$config->get('date_formats.Y-m-d');若是获取的配置项不存在,那么可以设置个默认的值,$config->get('redis.port', '6379')。
在./include/entryPoint.php引入require_once 'include/SugarObjects/SugarConfig.php',然后在./include/utils/autoloader.php中实例化$config = SugarConfig::getInstance(),如获取$config->get('developerMode'),接下来看看代码流程。【此步骤是以入口流程中进行的,即index.php--->entryPoint.php--->autoloader.php】
class SugarConfig { var $_cached_values = array(); // 单例 static function getInstance() { static $instance = null; if (is_null($instance)) { $instance = new SugarConfig(); } return $instance; } // 在首次获取的时候,引入array_utils.php,第二次就直接从缓存中获取 function get($key, $default = null) { if (!isset($this->_cached_values[$key])) { if (!class_exists('SugarArray', true)) { require 'include/utils/array_utils.php'; } $this->_cached_values[$key] = isset($GLOBALS['sugar_config']) ? SugarArray::staticGet($GLOBALS['sugar_config'], $key, $default) : $default; } return $this->_cached_values[$key]; } // 清除 function clearCache($key = null) { if (is_null($key)) { $this->_cached_values = array(); } else { unset($this->_cached_values[$key]); } } } // 这里继承了php自带的ArrayObject类,把数组转成了对象 class SugarArray extends ArrayObject { /** * Return the value matching $key if exists, otherwise $default value * * This method uses dot notation to look through multi-dimensional arrays * * @param string $key key to look up * @param mixed $default value to return if $key does not exist * @return mixed */ public function get($key, $default = null) { return $this->_getFromSource($key, $default); } /** * SugarConfig首先调用此方法,进入此方法后,调用get方法,再调用_getFromSource方法 * 如果配置文件的相关键为多维数组,那么递归调用_getRecursive获取 * 若是掉用的键不在配置文件内,则返回$default * Provided as a convinience method for fetching a value within an existing * array without instantiating a SugarArray * * NOTE: This should only used where refactoring an array into a SugarArray * is unfeasible. This operation is more expensive than a direct * SugarArray as each time it creates and throws away a new instance * * @param array $haystack haystack * @param string $needle needle * @param mixed $default default value to return * @return mixed */ static public function staticGet($haystack, $needle, $default = null) { if (empty($haystack)) { return $default; } $array = new self($haystack); return $array->get($needle, $default); } private function _getFromSource($key, $default) { if (strpos($key, '.') === false) { return isset($this[$key]) ? $this[$key] : $default; } $exploded = explode('.', $key); $current_key = array_shift($exploded); return $this->_getRecursive($this->_getFromSource($current_key, $default), $exploded, $default); } private function _getRecursive($raw_config, $children, $default) { if ($raw_config === $default) { return $default; } elseif (count($children) == 0) { return $raw_config; } else { $next_key = array_shift($children); return isset($raw_config[$next_key]) ? $this->_getRecursive($raw_config[$next_key], $children, $default) : $default; } } }
看完代码后,可以了解,获取某个配置文件的值可以使用$config->get('developerMode');获取配置文件内多维数组的,$config->get('date_formats.Y-m-d');若是获取的配置项不存在,那么可以设置个默认的值,$config->get('redis.port', '6379')。
相关文章推荐
- Android:通过Intent访问一个网页
- 查看mysql语句运行时间的2种方法
- dumpsys 使用
- 遇到的BUG集合
- Android开发艺术探索读书笔记——01 Activity的生命周期
- 在xib/storyboard里面设置view圆角半径
- Free download VPECKER Easydiag V6.4
- ASP.NET(C#)——IsPostback
- BCB 多线程的同步与协调
- 关于encodeURLComponent引申出来的杂谈
- 山寨Unity3D?搜狐畅游的免费开源游戏引擎Genesis-3D
- linux下配置ODBC连接MySql
- 85.如何更改iOS上的UISearchBar组件的内部背景UITextField颜色 修改UISearchBar删除按钮ClearButton
- 查看PHP错误日志
- 状态者模式 c#
- iOS8 Size Classes的理解与使用
- UVA12130 Summits(BFS + 贪心)
- UIImage size压缩后图片下面出现白色线问题
- android命名规范
- 杭电1210 Eddy's 洗牌问题