Register.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?php
  2. namespace \Qii\Consts;
  3. /**
  4. * 将键值保存到\Qii\Config\Register::$config中
  5. * 用于保存系统相关设置,保存项目相关的配置,请注意不出现key相互覆盖的情况,可以考虑加前缀
  6. *
  7. * @author Jinhui Zhu
  8. * @version 1.3
  9. *
  10. * Usage:
  11. * 保存值:
  12. * \Qii\Config\Register::set($key, $val);
  13. * 读取值:
  14. * \Qii\Config\Register::get($key, $default);
  15. * \Qii\Config\Register::$key($default);
  16. *
  17. *
  18. */
  19. class Register
  20. {
  21. const VERSION = '1.3';
  22. /**
  23. * 存储键值的变量
  24. *
  25. * @var Array
  26. */
  27. public static $_cache;
  28. /**
  29. * 设置键值
  30. *
  31. * @param String $key
  32. * @param String $val
  33. * @param Bool overwrite 是否覆盖之前保存的值,如果之前保存了值,要想再保存需要额外设置它为true,否则不让保存
  34. */
  35. public static function set($key, $val, $overwrite = true)
  36. {
  37. if (!\Qii\Config\Register::isValid($key, $overwrite)) \Qii\Application::_e('Overwrite', $key, __LINE__);
  38. \Qii\Config\Register::$_cache[$key] = $val;
  39. }
  40. /**
  41. * 设置键
  42. *
  43. * @param String $index
  44. * @param String $key
  45. * @param String $val
  46. */
  47. public static function add($index, $key, $val)
  48. {
  49. $added = \Qii\Config\Register::get(\Qii\Consts\Config::APP_LOADED_FILE, array());
  50. $added[$index][$key] = $val;
  51. \Qii\Config\Register::$_cache[$index] = $added;
  52. }
  53. /**
  54. * 移除某一个key
  55. * @param String $key
  56. */
  57. public static function remove($key)
  58. {
  59. if (!isset(\Qii\Config\Register::$_cache[$key])) return;
  60. unset(\Qii\Config\Register::$_cache[$key]);
  61. }
  62. /**
  63. * 获取保存的值
  64. *
  65. * @param String $key
  66. * @param String $index
  67. * @param Mix $default
  68. * @return Mix
  69. */
  70. public static function get($key, $default = null)
  71. {
  72. if (!$key) throw new Qii_Exceptions_Variable(\Qii::i(1003), __LINE__);
  73. //优先调用存在的get方法
  74. $method = 'get' . $key;
  75. if (method_exists('\Qii\Config\Register', $method)) return \Qii\Config\Register::$method();
  76. if (isset(\Qii\Config\Register::$_cache[$key])) {
  77. return \Qii\Config\Register::$_cache[$key];
  78. }
  79. return $default;
  80. }
  81. /**
  82. * 通过\Qii\Config\Register::$key($defaultVal)来获取内容
  83. *
  84. * @param String $method
  85. * @param Array $argvs
  86. * @return Mix
  87. */
  88. public static function __callStatic($method, $argvs)
  89. {
  90. $default = array_shift($argvs);
  91. return \Qii\Config\Register::get($method, $default);
  92. }
  93. /**
  94. * 整理数组,将0.key 最后会整理到 [0][key]中
  95. * @param Array $array
  96. * @return multitype:
  97. */
  98. public static function feval($array)
  99. {
  100. $data = array();
  101. foreach ($array AS $key => $value) {
  102. $keys = explode('.', $key);
  103. if (is_array($value)) {
  104. $string = "\$data['" . join("']['", $keys) . "']=" . var_export(\Qii\Config\Register::feval($value), true) . ";";
  105. } else {
  106. $string = "\$data['" . join("']['", $keys) . "']='" . $value . "';";
  107. }
  108. eval($string);
  109. }
  110. return $data;
  111. }
  112. /**
  113. * 读取ini配置文件
  114. *
  115. * @param String $fileName
  116. * @return Array
  117. */
  118. public static function ini($fileName)
  119. {
  120. if (!$fileName) throw new Qii_Exceptions_Variable(\Qii::i(1408), __LINE__);
  121. $ini = parse_ini_file($fileName, true);
  122. if (!$ini) throw new \Qii_Exceptions_InvalidFormat($fileName, __LINE__);
  123. $config = array();
  124. foreach ($ini AS $namespace => $properties) {
  125. $properties = \Qii\Config\Register::feval($properties);
  126. $extends = '';
  127. $name = $namespace;
  128. $namespaces = array();
  129. if (stristr($namespace, ':')) {
  130. $namespaces = explode(':', $namespace);
  131. $name = array_shift($namespaces);
  132. }
  133. $name = trim($name);
  134. $config[$name] = $properties;
  135. if (count($namespaces) > 0) {
  136. foreach ($namespaces AS $space) {
  137. //如果space以“.”开头,与key的方式放在当前key下边如[dev:.space],那么生成后的数据就是这样的[dev][space]否则是[space+dev]
  138. if (substr($space, 0, 1) == '.') {
  139. $space = substr($space, 1);
  140. if (isset($config[$space])) $config[$name][$space] = $config[$space];
  141. continue;
  142. }
  143. if (isset($config[$space])) $config[$name] = array_merge($config[$space], $config[$name]);
  144. }
  145. }
  146. }
  147. return $config;
  148. }
  149. /**
  150. * 返回cache的名称
  151. * @param String $iniFile
  152. * @return String
  153. */
  154. public static function getCacheName($iniFile)
  155. {
  156. $cacheName = basename($iniFile);
  157. $environs = \Qii\Config\Register::get(\Qii\Consts\Config::APP_ENVIRONS, array());
  158. if (isset($environs[$cacheName])) {
  159. $environ = $environs[$cacheName];
  160. $cacheName = $environ . '.' . $cacheName;
  161. }
  162. return $cacheName;
  163. }
  164. /**
  165. * 覆盖/添加ini文件的key对应的值
  166. * @param String $iniFile ini文件名
  167. * @param String $key 需覆盖的key
  168. * @param String $val key对应的值
  169. */
  170. public static function rewriteConfig($iniFile, $key, $val)
  171. {
  172. $config = \Qii\Config\Register::getIniConfigure($iniFile);
  173. $cacheName = \Qii\Config\Register::getCacheName($iniFile);
  174. $config[$key] = $val;
  175. \Qii\Config\Register::set($cacheName, $config);
  176. }
  177. /**
  178. * 删除ini配置文件中对应的key
  179. * @param string $iniFile ini配置我呢见
  180. * @param string $key 陪删除的key
  181. */
  182. public static function removeAppConfigure($iniFile, $key)
  183. {
  184. $config = \Qii\Config\Register::getIniConfigure($iniFile);
  185. $cacheName = \Qii\Config\Register::getCacheName($iniFile);
  186. unset($config[$key]);
  187. \Qii\Config\Register::set($cacheName, $config);
  188. }
  189. /**
  190. * 合并ini文件生成的数组
  191. * @param String $iniFile ini文件名
  192. * @param Array $array
  193. */
  194. public static function mergeAppConfigure($iniFile, $array)
  195. {
  196. if (!is_array($array)) return;
  197. $config = \Qii\Config\Register::getIniConfigure($iniFile);
  198. $environs = \Qii\Config\Register::get(\Qii\Consts\Config::APP_ENVIRONS, array());
  199. $cacheName = basename($iniFile);
  200. if (isset($environs[$cacheName])) {
  201. $environ = $environs[$cacheName];
  202. $cacheName = $environ . '.' . $cacheName;
  203. }
  204. $config = array_merge($config, $array);
  205. \Qii\Config\Register::set($cacheName, $config);
  206. }
  207. /**
  208. * 获取配置ini文件
  209. * @param String $iniFile
  210. * @param String $environ
  211. * @return boolean
  212. */
  213. public static function setConfig($iniFile, $environ = 'product')
  214. {
  215. $cacheName = basename($iniFile);
  216. $environs = \Qii\Config\Register::get(\Qii\Consts\Config::APP_ENVIRONS, array());
  217. $environs[$cacheName] = $environ;
  218. \Qii\Config\Register::set(\Qii\Consts\Config::APP_ENVIRONS, $environs);
  219. $cacheName = $environ . '.' . $cacheName;
  220. if (!is_file($iniFile)) return false;
  221. $cacheFile = \Qii\Autoloader\Psr4::getInstance()->getFileByPrefix(\Qii\Config\Register::get(\Qii\Consts\Config::APP_CACHE_PATH) . DS . $cacheName . '.php');
  222. if (\Qii\Config\Register::get(\Qii\Consts\Config::APP_CACHE_PATH)) {
  223. if (is_file($cacheFile)) {
  224. if (filemtime($cacheFile) == filemtime($iniFile)) {
  225. $common = include($cacheFile);
  226. \Qii\Config\Register::set($cacheName, $common);
  227. return $common;
  228. }
  229. }
  230. }
  231. $array = \Qii\Config\Register::ini($iniFile);
  232. if (!$array) return false;
  233. $common = $array['common'];
  234. if (isset($array[$environ])) {
  235. $environConfig = $array[$environ];
  236. $common = array_merge($common, $environConfig);
  237. }
  238. //如果文件不可写,touch就有问题,就不写缓存文件
  239. if (is_writeable($iniFile)) {
  240. file_put_contents($cacheFile, "<?php \n return " . var_export($common, true) . "\n?>", LOCK_EX);
  241. touch($iniFile);
  242. }
  243. \Qii\Config\Register::set($cacheName, $common);
  244. return $common;
  245. }
  246. /**
  247. * 设置网站的配置文件
  248. *
  249. * @param String $iniFile 配置我呢见
  250. * @param string $environ 环境变量
  251. * @return Object self
  252. */
  253. public static function setAppConfigure($iniFile, $environ = 'product')
  254. {
  255. return \Qii\Config\Register::setConfig($iniFile, $environ);
  256. }
  257. /**
  258. * 获取配置ini文件相关信息
  259. * @param String $fileName 文件名
  260. * @return Ambigous <Mix, multitype:>
  261. */
  262. public static function getIniConfigure($fileName)
  263. {
  264. $cacheName = basename($fileName);
  265. $environs = \Qii\Config\Register::get(\Qii\Consts\Config::APP_ENVIRONS, array());
  266. if (isset($environs[$cacheName])) {
  267. $cacheName = $environs[$cacheName] . '.' . $cacheName;
  268. }
  269. return \Qii\Config\Register::get($cacheName);
  270. }
  271. /**
  272. * 获取网站的配置信息
  273. *
  274. * @return Array
  275. */
  276. public static function getAppConfigure($iniFile = \Qii\Consts\Config::APP_INI, $key = NULL)
  277. {
  278. $appConfigure = \Qii\Config\Register::getIniConfigure($iniFile);
  279. if ($key == null) return $appConfigure;
  280. return isset($appConfigure[$key]) ? $appConfigure[$key] : NULL;
  281. }
  282. /**
  283. * 验证是否之前已经保存过这个属性,如果保存过,不覆盖属性对应的值就不保存
  284. *
  285. * @param String $key
  286. * @param Bool $overwrite
  287. * @return Bool
  288. */
  289. public static function isValid($key, $overwrite = false)
  290. {
  291. if ($overwrite) return true;
  292. if (isset(\Qii\Config\Register::$_cache[$key])) return false;
  293. return true;
  294. }
  295. /**
  296. * 获取当前系统环境
  297. * @return Ambigous <Mix, multitype:>
  298. */
  299. public static function getAppEnviron()
  300. {
  301. return isset(\Qii\Config\Register::$_cache[\Qii\Consts\Config::APP_ENVIRON]) ?
  302. \Qii\Config\Register::$_cache[\Qii\Consts\Config::APP_ENVIRON]
  303. : \Qii\Consts\Config::APP_DEFAULT_ENVIRON;
  304. }
  305. public function __call($method, $argvs)
  306. {
  307. }
  308. }