functions.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. // $Id$
  12. /**
  13. +------------------------------------------------------------------------------
  14. * Think公共函数库
  15. +------------------------------------------------------------------------------
  16. * @category Think
  17. * @package Common
  18. * @author liu21st <liu21st@gmail.com>
  19. * @version $Id$
  20. +------------------------------------------------------------------------------
  21. */
  22. // URL组装 支持不同模式和路由
  23. function U($url,$params=array(),$redirect=false,$suffix=true) {
  24. if(0===strpos($url,'/'))
  25. $url = substr($url,1);
  26. if(!strpos($url,'://')) // 没有指定项目名 使用当前项目名
  27. $url = APP_NAME.'://'.$url;
  28. if(stripos($url,'@?')) { // 给路由传递参数
  29. $url = str_replace('@?','@think?',$url);
  30. }elseif(stripos($url,'@')) { // 没有参数的路由
  31. $url = $url.MODULE_NAME;
  32. }
  33. // 分析URL地址
  34. $array = parse_url($url);
  35. $app = isset($array['scheme'])? $array['scheme'] :APP_NAME;
  36. $route = isset($array['user'])?$array['user']:'';
  37. if(defined('GROUP_NAME') && strcasecmp(GROUP_NAME,C('DEFAULT_GROUP')))
  38. $group= GROUP_NAME;
  39. if(isset($array['path'])) {
  40. $action = substr($array['path'],1);
  41. if(!isset($array['host'])) {
  42. // 没有指定模块名
  43. $module = MODULE_NAME;
  44. }else{// 指定模块
  45. if(strpos($array['host'],'-')) {
  46. list($group,$module) = explode('-',$array['host']);
  47. }else{
  48. $module = $array['host'];
  49. }
  50. }
  51. }else{ // 只指定操作
  52. $module = MODULE_NAME;
  53. $action = $array['host'];
  54. }
  55. if(isset($array['query'])) {
  56. parse_str($array['query'],$query);
  57. $params = array_merge($query,$params);
  58. }
  59. if(C('URL_DISPATCH_ON') && C('URL_MODEL')>0) {
  60. $depr = C('URL_PATHINFO_MODEL')==2?C('URL_PATHINFO_DEPR'):'/';
  61. $str = $depr;
  62. foreach ($params as $var=>$val)
  63. $str .= $var.$depr.$val.$depr;
  64. $str = substr($str,0,-1);
  65. $group = isset($group)?$group.$depr:'';
  66. if(!empty($route)) {
  67. $url = str_replace(APP_NAME,$app,__APP__).'/'.$group.$route.$str;
  68. }else{
  69. $url = str_replace(APP_NAME,$app,__APP__).'/'.$group.$module.$depr.$action.$str;
  70. }
  71. if($suffix && C('URL_HTML_SUFFIX'))
  72. $url .= C('URL_HTML_SUFFIX');
  73. }else{
  74. $params = http_build_query($params);
  75. if(isset($group)) {
  76. $url = str_replace(APP_NAME,$app,__APP__).'?'.C('VAR_GROUP').'='.$group.'&'.C('VAR_MODULE').'='.$module.'&'.C('VAR_ACTION').'='.$action.'&'.$params;
  77. }else{
  78. $url = str_replace(APP_NAME,$app,__APP__).'?'.C('VAR_MODULE').'='.$module.'&'.C('VAR_ACTION').'='.$action.'&'.$params;
  79. }
  80. }
  81. if($redirect)
  82. redirect($url);
  83. else
  84. return $url;
  85. }
  86. /**
  87. +----------------------------------------------------------
  88. * 字符串命名风格转换
  89. * type
  90. * =0 将Java风格转换为C的风格
  91. * =1 将C风格转换为Java的风格
  92. +----------------------------------------------------------
  93. * @access protected
  94. +----------------------------------------------------------
  95. * @param string $name 字符串
  96. * @param integer $type 转换类型
  97. +----------------------------------------------------------
  98. * @return string
  99. +----------------------------------------------------------
  100. */
  101. function parse_name($name,$type=0) {
  102. if($type) {
  103. return ucfirst(preg_replace("/_([a-zA-Z])/e", "strtoupper('\\1')", $name));
  104. }else{
  105. $name = preg_replace("/[A-Z]/", "_\\0", $name);
  106. return strtolower(trim($name, "_"));
  107. }
  108. }
  109. // 错误输出
  110. function halt($error) {
  111. if(IS_CLI) exit ($error);
  112. $e = array();
  113. if(C('APP_DEBUG')){
  114. //调试模式下输出错误信息
  115. if(!is_array($error)) {
  116. $trace = debug_backtrace();
  117. $e['message'] = $error;
  118. $e['file'] = $trace[0]['file'];
  119. $e['class'] = $trace[0]['class'];
  120. $e['function'] = $trace[0]['function'];
  121. $e['line'] = $trace[0]['line'];
  122. $traceInfo='';
  123. $time = date("y-m-d H:i:m");
  124. foreach($trace as $t)
  125. {
  126. $traceInfo .= '['.$time.'] '.$t['file'].' ('.$t['line'].') ';
  127. $traceInfo .= $t['class'].$t['type'].$t['function'].'(';
  128. $traceInfo .= implode(', ', $t['args']);
  129. $traceInfo .=")<br/>";
  130. }
  131. $e['trace'] = $traceInfo;
  132. }else {
  133. $e = $error;
  134. }
  135. // 包含异常页面模板
  136. include C('TMPL_EXCEPTION_FILE');
  137. }
  138. else
  139. {
  140. //否则定向到错误页面
  141. $error_page = C('ERROR_PAGE');
  142. if(!empty($error_page)){
  143. redirect($error_page);
  144. }else {
  145. if(C('SHOW_ERROR_MSG'))
  146. $e['message'] = is_array($error)?$error['message']:$error;
  147. else
  148. $e['message'] = C('ERROR_MESSAGE');
  149. // 包含异常页面模板
  150. include C('TMPL_EXCEPTION_FILE');
  151. }
  152. }
  153. exit;
  154. }
  155. // URL重定向
  156. function redirect($url,$time=0,$msg='')
  157. {
  158. //多行URL地址支持
  159. $url = str_replace(array("\n", "\r"), '', $url);
  160. if(empty($msg))
  161. $msg = "系统将在{$time}秒之后自动跳转到{$url}!";
  162. if (!headers_sent()) {
  163. // redirect
  164. if(0===$time) {
  165. header("Location: ".$url);
  166. }else {
  167. header("refresh:{$time};url={$url}");
  168. echo($msg);
  169. }
  170. exit();
  171. }else {
  172. $str = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
  173. if($time!=0)
  174. $str .= $msg;
  175. exit($str);
  176. }
  177. }
  178. // 自定义异常处理
  179. function throw_exception($msg,$type='ThinkException',$code=0)
  180. {
  181. if(IS_CLI) exit($msg);
  182. if(class_exists($type,false))
  183. throw new $type($msg,$code,true);
  184. else
  185. halt($msg); // 异常类型不存在则输出错误信息字串
  186. }
  187. // 区间调试开始
  188. function debug_start($label='')
  189. {
  190. $GLOBALS[$label]['_beginTime'] = microtime(TRUE);
  191. if ( MEMORY_LIMIT_ON ) $GLOBALS[$label]['_beginMem'] = memory_get_usage();
  192. }
  193. // 区间调试结束,显示指定标记到当前位置的调试
  194. function debug_end($label='')
  195. {
  196. $GLOBALS[$label]['_endTime'] = microtime(TRUE);
  197. echo '<div style="text-align:center;width:100%">Process '.$label.': Times '.number_format($GLOBALS[$label]['_endTime']-$GLOBALS[$label]['_beginTime'],6).'s ';
  198. if ( MEMORY_LIMIT_ON ) {
  199. $GLOBALS[$label]['_endMem'] = memory_get_usage();
  200. echo ' Memories '.number_format(($GLOBALS[$label]['_endMem']-$GLOBALS[$label]['_beginMem'])/1024).' k';
  201. }
  202. echo '</div>';
  203. }
  204. // 浏览器友好的变量输出
  205. function dump($var, $echo=true,$label=null, $strict=true)
  206. {
  207. $label = ($label===null) ? '' : rtrim($label) . ' ';
  208. if(!$strict) {
  209. if (ini_get('html_errors')) {
  210. $output = print_r($var, true);
  211. $output = "<pre>".$label.htmlspecialchars($output,ENT_QUOTES)."</pre>";
  212. } else {
  213. $output = $label . " : " . print_r($var, true);
  214. }
  215. }else {
  216. ob_start();
  217. var_dump($var);
  218. $output = ob_get_clean();
  219. if(!extension_loaded('xdebug')) {
  220. $output = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $output);
  221. $output = '<pre>'. $label. htmlspecialchars($output, ENT_QUOTES). '</pre>';
  222. }
  223. }
  224. if ($echo) {
  225. echo($output);
  226. return null;
  227. }else
  228. return $output;
  229. }
  230. // 取得对象实例 支持调用类的静态方法
  231. function get_instance_of($name,$method='',$args=array())
  232. {
  233. static $_instance = array();
  234. $identify = empty($args)?$name.$method:$name.$method.to_guid_string($args);
  235. if (!isset($_instance[$identify])) {
  236. if(class_exists($name)){
  237. $o = new $name();
  238. if(method_exists($o,$method)){
  239. if(!empty($args)) {
  240. $_instance[$identify] = call_user_func_array(array(&$o, $method), $args);
  241. }else {
  242. $_instance[$identify] = $o->$method();
  243. }
  244. }
  245. else
  246. $_instance[$identify] = $o;
  247. }
  248. else
  249. halt(L('_CLASS_NOT_EXIST_').':'.$name);
  250. }
  251. return $_instance[$identify];
  252. }
  253. /**
  254. +----------------------------------------------------------
  255. * 系统自动加载ThinkPHP基类库和当前项目的model和Action对象
  256. * 并且支持配置自动加载路径
  257. +----------------------------------------------------------
  258. * @param string $name 对象类名
  259. +----------------------------------------------------------
  260. * @return void
  261. +----------------------------------------------------------
  262. */
  263. function __autoload($name)
  264. {
  265. // 检查是否存在别名定义
  266. if(alias_import($name)) return ;
  267. // 自动加载当前项目的Actioon类和Model类
  268. if(substr($name,-5)=="Model") {
  269. require_cache(LIB_PATH.'Model/'.$name.'.class.php');
  270. }elseif(substr($name,-6)=="Action"){
  271. require_cache(LIB_PATH.'Action/'.$name.'.class.php');
  272. }else {
  273. // 根据自动加载路径设置进行尝试搜索
  274. if(C('APP_AUTOLOAD_PATH')) {
  275. $paths = explode(',',C('APP_AUTOLOAD_PATH'));
  276. foreach ($paths as $path){
  277. if(import($path.$name)) {
  278. // 如果加载类成功则返回
  279. return ;
  280. }
  281. }
  282. }
  283. }
  284. return ;
  285. }
  286. // 优化的require_once
  287. function require_cache($filename)
  288. {
  289. static $_importFiles = array();
  290. $filename = realpath($filename);
  291. if (!isset($_importFiles[$filename])) {
  292. if(file_exists_case($filename)){
  293. require $filename;
  294. $_importFiles[$filename] = true;
  295. }
  296. else
  297. {
  298. $_importFiles[$filename] = false;
  299. }
  300. }
  301. return $_importFiles[$filename];
  302. }
  303. // 区分大小写的文件存在判断
  304. function file_exists_case($filename) {
  305. if(is_file($filename)) {
  306. if(IS_WIN && C('APP_FILE_CASE')) {
  307. if(basename(realpath($filename)) != basename($filename))
  308. return false;
  309. }
  310. return true;
  311. }
  312. return false;
  313. }
  314. /**
  315. +----------------------------------------------------------
  316. * 导入所需的类库 同java的Import
  317. * 本函数有缓存功能
  318. +----------------------------------------------------------
  319. * @param string $class 类库命名空间字符串
  320. * @param string $baseUrl 起始路径
  321. * @param string $ext 导入的文件扩展名
  322. +----------------------------------------------------------
  323. * @return boolen
  324. +----------------------------------------------------------
  325. */
  326. function import($class,$baseUrl = '',$ext='.class.php')
  327. {
  328. static $_file = array();
  329. static $_class = array();
  330. $class = str_replace(array('.','#'), array('/','.'), $class);
  331. if('' === $baseUrl && false === strpos($class,'/')) {
  332. // 检查别名导入
  333. return alias_import($class);
  334. } //echo('<br>'.$class.$baseUrl);
  335. if(isset($_file[$class.$baseUrl]))
  336. return true;
  337. else
  338. $_file[$class.$baseUrl] = true;
  339. $class_strut = explode("/",$class);
  340. if(empty($baseUrl)) {
  341. if('@'==$class_strut[0] || APP_NAME == $class_strut[0] ) {
  342. //加载当前项目应用类库
  343. $baseUrl = dirname(LIB_PATH);
  344. $class = str_replace(array(APP_NAME.'/','@/'),LIB_DIR.'/',$class);
  345. }elseif(in_array(strtolower($class_strut[0]),array('think','org','com'))) {
  346. //加载ThinkPHP基类库或者公共类库
  347. // think 官方基类库 org 第三方公共类库 com 企业公共类库
  348. $baseUrl = THINK_PATH.'/Lib/';
  349. }else {
  350. // 加载其他项目应用类库
  351. $class = substr_replace($class, '', 0,strlen($class_strut[0])+1);
  352. $baseUrl = APP_PATH.'/../'.$class_strut[0].'/'.LIB_DIR.'/';
  353. }
  354. }
  355. if(substr($baseUrl, -1) != "/") $baseUrl .= "/";
  356. $classfile = $baseUrl . $class . $ext;
  357. if($ext == '.class.php' && is_file($classfile)) {
  358. // 冲突检测
  359. $class = basename($classfile,$ext);
  360. if(isset($_class[$class]))
  361. throw_exception(L('_CLASS_CONFLICT_').':'.$_class[$class].' '.$classfile);
  362. $_class[$class] = $classfile;
  363. }
  364. //导入目录下的指定类库文件
  365. return require_cache($classfile);
  366. }
  367. /**
  368. +----------------------------------------------------------
  369. * 基于命名空间方式导入函数库
  370. * load('@.Util.Array')
  371. +----------------------------------------------------------
  372. * @param string $name 函数库命名空间字符串
  373. * @param string $baseUrl 起始路径
  374. * @param string $ext 导入的文件扩展名
  375. +----------------------------------------------------------
  376. * @return void
  377. +----------------------------------------------------------
  378. */
  379. function load($name,$baseUrl='',$ext='.php') {
  380. $name = str_replace(array('.','#'), array('/','.'), $name);
  381. if(empty($baseUrl)) {
  382. if(0 === strpos($name,'@/')) {
  383. //加载当前项目函数库
  384. $baseUrl = APP_PATH.'/Common/';
  385. $name = substr($name,2);
  386. }else{
  387. //加载ThinkPHP 系统函数库
  388. $baseUrl = THINK_PATH.'/Common/';
  389. }
  390. }
  391. if(substr($baseUrl, -1) != "/") $baseUrl .= "/";
  392. include $baseUrl . $name . $ext;
  393. }
  394. // 快速导入第三方框架类库
  395. // 所有第三方框架的类库文件统一放到 系统的Vendor目录下面
  396. // 并且默认都是以.php后缀导入
  397. function vendor($class,$baseUrl = '',$ext='.php')
  398. {
  399. if(empty($baseUrl)) $baseUrl = VENDOR_PATH;
  400. return import($class,$baseUrl,$ext);
  401. }
  402. // 快速定义和导入别名
  403. function alias_import($alias,$classfile='') {
  404. static $_alias = array();
  405. if('' !== $classfile) {
  406. // 定义别名导入
  407. $_alias[$alias] = $classfile;
  408. return ;
  409. }
  410. if(is_string($alias)) {
  411. if(isset($_alias[$alias]))
  412. return require_cache($_alias[$alias]);
  413. }elseif(is_array($alias)){
  414. foreach ($alias as $key=>$val)
  415. $_alias[$key] = $val;
  416. return ;
  417. }
  418. return false;
  419. }
  420. /**
  421. +----------------------------------------------------------
  422. * D函数用于实例化Model
  423. +----------------------------------------------------------
  424. * @param string name Model名称
  425. * @param string app Model所在项目
  426. +----------------------------------------------------------
  427. * @return Model
  428. +----------------------------------------------------------
  429. */
  430. function D($name='',$app='')
  431. {
  432. static $_model = array();
  433. if(empty($name)) return new Model;
  434. if(empty($app)) $app = C('DEFAULT_APP');
  435. if(isset($_model[$app.$name]))
  436. return $_model[$app.$name];
  437. $OriClassName = $name;
  438. if(strpos($name,C('APP_GROUP_DEPR'))) {
  439. $array = explode(C('APP_GROUP_DEPR'),$name);
  440. $name = array_pop($array);
  441. $className = $name.'Model';
  442. import($app.'.Model.'.implode('.',$array).'.'.$className);
  443. }else{
  444. $className = $name.'Model';
  445. import($app.'.Model.'.$className);
  446. }
  447. if(class_exists($className)) {
  448. $model = new $className();
  449. }else {
  450. $model = new Model($name);
  451. }
  452. $_model[$app.$OriClassName] = $model;
  453. return $model;
  454. }
  455. /**
  456. +----------------------------------------------------------
  457. * M函数用于实例化一个没有模型文件的Model
  458. +----------------------------------------------------------
  459. * @param string name Model名称
  460. +----------------------------------------------------------
  461. * @return Model
  462. +----------------------------------------------------------
  463. */
  464. function M($name='',$class='Model') {
  465. static $_model = array();
  466. if(!isset($_model[$name.'_'.$class]))
  467. $_model[$name.'_'.$class] = new $class($name);
  468. return $_model[$name.'_'.$class];
  469. }
  470. /**
  471. +----------------------------------------------------------
  472. * A函数用于实例化Action
  473. +----------------------------------------------------------
  474. * @param string name Action名称
  475. * @param string app Model所在项目
  476. +----------------------------------------------------------
  477. * @return Action
  478. +----------------------------------------------------------
  479. */
  480. function A($name,$app='@')
  481. {
  482. static $_action = array();
  483. if(isset($_action[$app.$name]))
  484. return $_action[$app.$name];
  485. $OriClassName = $name;
  486. if(strpos($name,C('APP_GROUP_DEPR'))) {
  487. $array = explode(C('APP_GROUP_DEPR'),$name);
  488. $name = array_pop($array);
  489. $className = $name.'Action';
  490. import($app.'.Action.'.implode('.',$array).'.'.$className);
  491. }else{
  492. $className = $name.'Action';
  493. import($app.'.Action.'.$className);
  494. }
  495. if(class_exists($className)) {
  496. $action = new $className();
  497. $_action[$app.$OriClassName] = $action;
  498. return $action;
  499. }else {
  500. return false;
  501. }
  502. }
  503. // 远程调用模块的操作方法
  504. function R($module,$action,$app='@') {
  505. $class = A($module,$app);
  506. if($class)
  507. return call_user_func(array(&$class,$action));
  508. else
  509. return false;
  510. }
  511. // 获取和设置语言定义(不区分大小写)
  512. function L($name=null,$value=null) {
  513. static $_lang = array();
  514. // 空参数返回所有定义
  515. if(empty($name)) return $_lang;
  516. // 判断语言获取(或设置)
  517. // 若不存在,直接返回全大写$name
  518. if (is_string($name) )
  519. {
  520. $name = strtoupper($name);
  521. if (is_null($value))
  522. return isset($_lang[$name]) ? $_lang[$name] : $name;
  523. $_lang[$name] = $value;// 语言定义
  524. return;
  525. }
  526. // 批量定义
  527. if (is_array($name))
  528. $_lang = array_merge($_lang,array_change_key_case($name,CASE_UPPER));
  529. return;
  530. }
  531. // 获取配置值
  532. function C($name=null,$value=null)
  533. {
  534. static $_config = array();
  535. // 无参数时获取所有
  536. if(empty($name)) return $_config;
  537. // 优先执行设置获取或赋值
  538. if (is_string($name))
  539. {
  540. if (!strpos($name,'.')) {
  541. $name = strtolower($name);
  542. if (is_null($value))
  543. return isset($_config[$name])? $_config[$name] : null;
  544. $_config[$name] = $value;
  545. return;
  546. }
  547. // 二维数组设置和获取支持
  548. $name = explode('.',$name);
  549. $name[0] = strtolower($name[0]);
  550. if (is_null($value))
  551. return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
  552. $_config[$name[0]][$name[1]] = $value;
  553. return;
  554. }
  555. // 批量设置
  556. if(is_array($name))
  557. return $_config = array_merge($_config,array_change_key_case($name));
  558. return null;// 避免非法参数
  559. }
  560. // 处理标签
  561. function tag($name,$params=array()) {
  562. $tags = C('_tags_.'.$name);
  563. if($tags) {
  564. foreach ($tags as $key=>$call){
  565. if(is_callable($call))
  566. $result = call_user_func_array($call,$params);
  567. }
  568. return $result;
  569. }
  570. return false;
  571. }
  572. // 执行行为
  573. function B($name) {
  574. $class = $name.'Behavior';
  575. require_cache(LIB_PATH.'Behavior/'.$class.'.class.php');
  576. $behavior = new $class();
  577. $behavior->run();
  578. }
  579. // 渲染输出Widget
  580. function W($name,$data=array(),$return=false) {
  581. $class = $name.'Widget';
  582. require_cache(LIB_PATH.'Widget/'.$class.'.class.php');
  583. if(!class_exists($class))
  584. throw_exception(L('_CLASS_NOT_EXIST_').':'.$class);
  585. $widget = Think::instance($class);
  586. $content = $widget->render($data);
  587. if($return)
  588. return $content;
  589. else
  590. echo $content;
  591. }
  592. // 全局缓存设置和读取
  593. function S($name,$value='',$expire='',$type='') {
  594. static $_cache = array();
  595. alias_import('Cache');
  596. //取得缓存对象实例
  597. $cache = Cache::getInstance($type);
  598. if('' !== $value) {
  599. if(is_null($value)) {
  600. // 删除缓存
  601. $result = $cache->rm($name);
  602. if($result) unset($_cache[$type.'_'.$name]);
  603. return $result;
  604. }else{
  605. // 缓存数据
  606. $cache->set($name,$value,$expire);
  607. $_cache[$type.'_'.$name] = $value;
  608. }
  609. return ;
  610. }
  611. if(isset($_cache[$type.'_'.$name]))
  612. return $_cache[$type.'_'.$name];
  613. // 获取缓存数据
  614. $value = $cache->get($name);
  615. $_cache[$type.'_'.$name] = $value;
  616. return $value;
  617. }
  618. // 快速文件数据读取和保存 针对简单类型数据 字符串、数组
  619. function F($name,$value='',$path=DATA_PATH) {
  620. static $_cache = array();
  621. $filename = $path.$name.'.php';
  622. if('' !== $value) {
  623. if(is_null($value)) {
  624. // 删除缓存
  625. return unlink($filename);
  626. }else{
  627. // 缓存数据
  628. $dir = dirname($filename);
  629. // 目录不存在则创建
  630. if(!is_dir($dir)) mkdir($dir);
  631. return file_put_contents($filename,"<?php\nreturn ".var_export($value,true).";\n?>");
  632. }
  633. }
  634. if(isset($_cache[$name])) return $_cache[$name];
  635. // 获取缓存数据
  636. if(is_file($filename)) {
  637. $value = include $filename;
  638. $_cache[$name] = $value;
  639. }else{
  640. $value = false;
  641. }
  642. return $value;
  643. }
  644. // 根据PHP各种类型变量生成唯一标识号
  645. function to_guid_string($mix)
  646. {
  647. if(is_object($mix) && function_exists('spl_object_hash')) {
  648. return spl_object_hash($mix);
  649. }elseif(is_resource($mix)){
  650. $mix = get_resource_type($mix).strval($mix);
  651. }else{
  652. $mix = serialize($mix);
  653. }
  654. return md5($mix);
  655. }
  656. //[RUNTIME]
  657. // 编译文件
  658. function compile($filename,$runtime=false) {
  659. $content = file_get_contents($filename);
  660. if(true === $runtime)
  661. // 替换预编译指令
  662. $content = preg_replace('/\/\/\[RUNTIME\](.*?)\/\/\[\/RUNTIME\]/s','',$content);
  663. $content = substr(trim($content),5);
  664. if('?>' == substr($content,-2))
  665. $content = substr($content,0,-2);
  666. return $content;
  667. }
  668. // 去除代码中的空白和注释
  669. function strip_whitespace($content) {
  670. if (!function_exists('token_get_all'))
  671. return $content;
  672. $stripStr = '';
  673. //分析php源码
  674. $tokens = token_get_all ($content);
  675. $last_space = false;
  676. for ($i = 0, $j = count ($tokens); $i < $j; $i++)
  677. {
  678. if (is_string ($tokens[$i]))
  679. {
  680. $last_space = false;
  681. $stripStr .= $tokens[$i];
  682. }
  683. else
  684. {
  685. switch ($tokens[$i][0])
  686. {
  687. //过滤各种PHP注释
  688. case T_COMMENT:
  689. case T_DOC_COMMENT:
  690. break;
  691. //过滤空格
  692. case T_WHITESPACE:
  693. if (!$last_space)
  694. {
  695. $stripStr .= ' ';
  696. $last_space = true;
  697. }
  698. break;
  699. default:
  700. $last_space = false;
  701. $stripStr .= $tokens[$i][1];
  702. }
  703. }
  704. }
  705. return $stripStr;
  706. }
  707. // 根据数组生成常量定义
  708. function array_define($array) {
  709. $content = '';
  710. foreach($array as $key=>$val) {
  711. $key = strtoupper($key);
  712. if(in_array($key,array('THINK_PATH','APP_NAME','APP_PATH','RUNTIME_PATH','RUNTIME_ALLINONE','THINK_MODE')))
  713. $content .= 'if(!defined(\''.$key.'\')) ';
  714. if(is_int($val) || is_float($val)) {
  715. $content .= "define('".$key."',".$val.");";
  716. }elseif(is_bool($val)) {
  717. $val = ($val)?'true':'false';
  718. $content .= "define('".$key."',".$val.");";
  719. }elseif(is_string($val)) {
  720. $content .= "define('".$key."','".addslashes($val)."');";
  721. }
  722. }
  723. return $content;
  724. }
  725. //[/RUNTIME]
  726. // 循环创建目录
  727. function mk_dir($dir, $mode = 0755)
  728. {
  729. if (is_dir($dir) || @mkdir($dir,$mode)) return true;
  730. if (!mk_dir(dirname($dir),$mode)) return false;
  731. return @mkdir($dir,$mode);
  732. }
  733. // 自动转换字符集 支持数组转换
  734. function auto_charset($fContents,$from,$to){
  735. $from = strtoupper($from)=='UTF8'? 'utf-8':$from;
  736. $to = strtoupper($to)=='UTF8'? 'utf-8':$to;
  737. if( strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents)) ){
  738. //如果编码相同或者非字符串标量则不转换
  739. return $fContents;
  740. }
  741. if(is_string($fContents) ) {
  742. if(function_exists('mb_convert_encoding')){
  743. return mb_convert_encoding ($fContents, $to, $from);
  744. }elseif(function_exists('iconv')){
  745. return iconv($from,$to,$fContents);
  746. }else{
  747. return $fContents;
  748. }
  749. }
  750. elseif(is_array($fContents)){
  751. foreach ( $fContents as $key => $val ) {
  752. $_key = auto_charset($key,$from,$to);
  753. $fContents[$_key] = auto_charset($val,$from,$to);
  754. if($key != $_key )
  755. unset($fContents[$key]);
  756. }
  757. return $fContents;
  758. }
  759. else{
  760. return $fContents;
  761. }
  762. }
  763. // xml编码
  764. function xml_encode($data,$encoding='utf-8',$root="think") {
  765. $xml = '<?xml version="1.0" encoding="'.$encoding.'"?>';
  766. $xml.= '<'.$root.'>';
  767. $xml.= data_to_xml($data);
  768. $xml.= '</'.$root.'>';
  769. return $xml;
  770. }
  771. function data_to_xml($data) {
  772. if(is_object($data)) {
  773. $data = get_object_vars($data);
  774. }
  775. $xml = '';
  776. foreach($data as $key=>$val) {
  777. is_numeric($key) && $key="item id=\"$key\"";
  778. $xml.="<$key>";
  779. $xml.=(is_array($val)||is_object($val))?data_to_xml($val):$val;
  780. list($key,)=explode(' ',$key);
  781. $xml.="</$key>";
  782. }
  783. return $xml;
  784. }
  785. /**
  786. +----------------------------------------------------------
  787. * Cookie 设置、获取、清除 (支持数组或对象直接设置) 2009-07-9
  788. +----------------------------------------------------------
  789. * 1 获取cookie: cookie('name')
  790. * 2 清空当前设置前缀的所有cookie: cookie(null)
  791. * 3 删除指定前缀所有cookie: cookie(null,'think_') | 注:前缀将不区分大小写
  792. * 4 设置cookie: cookie('name','value') | 指定保存时间: cookie('name','value',3600)
  793. * 5 删除cookie: cookie('name',null)
  794. +----------------------------------------------------------
  795. * $option 可用设置prefix,expire,path,domain
  796. * 支持数组形式:cookie('name','value',array('expire'=>1,'prefix'=>'think_'))
  797. * 支持query形式字符串:cookie('name','value','prefix=tp_&expire=10000')
  798. */
  799. function cookie($name,$value='',$option=null)
  800. {
  801. // 默认设置
  802. $config = array(
  803. 'prefix' => C('COOKIE_PREFIX'), // cookie 名称前缀
  804. 'expire' => C('COOKIE_EXPIRE'), // cookie 保存时间
  805. 'path' => C('COOKIE_PATH'), // cookie 保存路径
  806. 'domain' => C('COOKIE_DOMAIN'), // cookie 有效域名
  807. );
  808. // 参数设置(会覆盖黙认设置)
  809. if (!empty($option)) {
  810. if (is_numeric($option))
  811. $option = array('expire'=>$option);
  812. elseif( is_string($option) )
  813. parse_str($option,$option);
  814. array_merge($config,array_change_key_case($option));
  815. }
  816. // 清除指定前缀的所有cookie
  817. if (is_null($name)) {
  818. if (empty($_COOKIE)) return;
  819. // 要删除的cookie前缀,不指定则删除config设置的指定前缀
  820. $prefix = empty($value)? $config['prefix'] : $value;
  821. if (!empty($prefix))// 如果前缀为空字符串将不作处理直接返回
  822. {
  823. foreach($_COOKIE as $key=>$val) {
  824. if (0 === stripos($key,$prefix)){
  825. setcookie($_COOKIE[$key],'',time()-3600,$config['path'],$config['domain']);
  826. unset($_COOKIE[$key]);
  827. }
  828. }
  829. }
  830. return;
  831. }
  832. $name = $config['prefix'].$name;
  833. if (''===$value){
  834. return isset($_COOKIE[$name]) ? unserialize($_COOKIE[$name]) : null;// 获取指定Cookie
  835. }else {
  836. if (is_null($value)) {
  837. setcookie($name,'',time()-3600,$config['path'],$config['domain']);
  838. unset($_COOKIE[$name]);// 删除指定cookie
  839. }else {
  840. // 设置cookie
  841. $expire = !empty($config['expire'])? time()+ intval($config['expire']):0;
  842. setcookie($name,serialize($value),$expire,$config['path'],$config['domain']);
  843. $_COOKIE[$name] = serialize($value);
  844. }
  845. }
  846. }
  847. ?>