BVB Source Codes

The latest thinkphp v5.2 work order system Show functions.php Source code

Return Download The latest thinkphp v5.2 work order system: download functions.php Source code - Download The latest thinkphp v5.2 work order system Source code - Type:.php
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2014 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.  
  12. /**
  13.  * Think API模式函数库
  14.  */
  15.  
  16. /**
  17.  * 获取和设置配置参数 支持批量定义
  18.  * @param string|array $name 配置变量
  19.  * @param mixed $value 配置值
  20.  * @param mixed $default 默认值
  21.  * @return mixed
  22.  */
  23. function C($name=null, $value=null,$default=null) {
  24.     static $_config = array();
  25.     // 无参数时获取所有
  26.     if (empty($name)) {
  27.         return $_config;
  28.     }
  29.     // 优先执行设置获取或赋值
  30.     if (is_string($name)) {
  31.         if (!strpos($name, '.')) {
  32.             $name = strtolower($name);
  33.             if (is_null($value))
  34.                 return isset($_config[$name]) ? $_config[$name] : $default;
  35.             $_config[$name] = $value;
  36.             return;
  37.         }
  38.         // 二维数组设置和获取支持
  39.         $name = explode('.', $name);
  40.         $name[0]   =  strtolower($name[0]);
  41.         if (is_null($value))
  42.             return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : $default;
  43.         $_config[$name[0]][$name[1]] = $value;
  44.         return;
  45.     }
  46.     // 批量设置
  47.     if (is_array($name)){
  48.         $_config = array_merge($_config, array_change_key_case($name));
  49.         return;
  50.     }
  51.     return null; // 避免非法参数
  52. }
  53.  
  54. /**
  55.  * 加载配置文件 支持格式转换 仅支持一级配置
  56.  * @param string $file 配置文件名
  57.  * @param string $parse 配置解析方法 有些格式需要用户自己解析
  58.  * @return void
  59.  */
  60. function load_config($file,$parse=CONF_PARSE){
  61.     $ext  = pathinfo($file,PATHINFO_EXTENSION);
  62.     switch($ext){
  63.         case 'php':
  64.             return include $file;
  65.         case 'ini':
  66.             return parse_ini_file($file);
  67.         case 'yaml':
  68.             return yaml_parse_file($file);
  69.         case 'xml':
  70.             return (array)simplexml_load_file($file);
  71.         case 'json':
  72.             return json_decode(file_get_contents($file), true);
  73.         default:
  74.             if(function_exists($parse)){
  75.                 return $parse($file);
  76.             }else{
  77.                 E(L('_NOT_SUPPORT_').':'.$ext);
  78.             }
  79.     }
  80. }
  81.  
  82. /**
  83.  * 抛出异常处理
  84.  * @param string $msg 异常消息
  85.  * @param integer $code 异常代码 默认为0
  86.  * @return void
  87.  */
  88. function E($msg, $code=0) {
  89.     throw new Think\Exception($msg, $code);
  90. }
  91.  
  92. /**
  93.  * 记录和统计时间(微秒)和内存使用情况
  94.  * 使用方法:
  95.  * <code>
  96.  * G('begin'); // 记录开始标记位
  97.  * // ... 区间运行代码
  98.  * G('end'); // 记录结束标签位
  99.  * echo G('begin','end',6); // 统计区间运行时间 精确到小数后6位
  100.  * echo G('begin','end','m'); // 统计区间内存使用情况
  101.  * 如果end标记位没有定义,则会自动以当前作为标记位
  102.  * 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效
  103.  * </code>
  104.  * @param string $start 开始标签
  105.  * @param string $end 结束标签
  106.  * @param integer|string $dec 小数位或者m
  107.  * @return mixed
  108.  */
  109. function G($start,$end='',$dec=4) {
  110.     static $_info       =   array();
  111.     static $_mem        =   array();
  112.     if(is_float($end)) { // 记录时间
  113.         $_info[$start]  =   $end;
  114.     }elseif(!empty($end)){ // 统计时间和内存使用
  115.         if(!isset($_info[$end])) $_info[$end]       =  microtime(TRUE);
  116.         if(MEMORY_LIMIT_ON && $dec=='m'){
  117.             if(!isset($_mem[$end])) $_mem[$end]     =  memory_get_usage();
  118.             return number_format(($_mem[$end]-$_mem[$start])/1024);
  119.         }else{
  120.             return number_format(($_info[$end]-$_info[$start]),$dec);
  121.         }
  122.  
  123.     }else{ // 记录时间和内存使用
  124.         $_info[$start]  =  microtime(TRUE);
  125.         if(MEMORY_LIMIT_ON) $_mem[$start]           =  memory_get_usage();
  126.     }
  127. }
  128.  
  129. /**
  130.  * 获取和设置语言定义(不区分大小写)
  131.  * @param string|array $name 语言变量
  132.  * @param string $value 语言值
  133.  * @return mixed
  134.  */
  135. function L($name=null, $value=null) {
  136.     static $_lang = array();
  137.     // 空参数返回所有定义
  138.     if (empty($name))
  139.         return $_lang;
  140.     // 判断语言获取(或设置)
  141.     // 若不存在,直接返回全大写$name
  142.     if (is_string($name)) {
  143.         $name = strtoupper($name);
  144.         if (is_null($value))
  145.             return isset($_lang[$name]) ? $_lang[$name] : $name;
  146.         $_lang[$name] = $value; // 语言定义
  147.         return;
  148.     }
  149.     // 批量定义
  150.     if (is_array($name))
  151.         $_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER));
  152.     return;
  153. }
  154.  
  155. /**
  156.  * 添加和获取页面Trace记录
  157.  * @param string $value 变量
  158.  * @param string $label 标签
  159.  * @param string $level 日志级别
  160.  * @param boolean $record 是否记录日志
  161.  * @return void
  162.  */
  163. function trace($value='[think]',$label='',$level='DEBUG',$record=false) {
  164.     return Think\Think::trace($value,$label,$level,$record);
  165. }
  166.  
  167. /**
  168.  * 编译文件
  169.  * @param string $filename 文件名
  170.  * @return string
  171.  */
  172. function compile($filename) {
  173.     $content    =   php_strip_whitespace($filename);
  174.     $content    =   trim(substr($content, 5));
  175.     // 替换预编译指令
  176.     $content    =   preg_replace('/\/\/\[RUNTIME\](.*?)\/\/\[\/RUNTIME\]/s', '', $content);
  177.     if(0===strpos($content,'namespace')){
  178.         $content    =   preg_replace('/namespace\s(.*?);/','namespace \\1{',$content,1);
  179.     }else{
  180.         $content    =   'namespace {'.$content;
  181.     }
  182.     if ('?>' == substr($content, -2))
  183.         $content    = substr($content, 0, -2);
  184.     return $content.'}';
  185. }
  186.  
  187. /**
  188.  * 获取输入参数 支持过滤和默认值
  189.  * 使用方法:
  190.  * <code>
  191.  * I('id',0); 获取id参数 自动判断get或者post
  192.  * I('post.name','','htmlspecialchars'); 获取$_POST['name']
  193.  * I('get.'); 获取$_GET
  194.  * </code>
  195.  * @param string $name 变量的名称 支持指定类型
  196.  * @param mixed $default 不存在的时候默认值
  197.  * @param mixed $filter 参数过滤方法
  198.  * @param mixed $datas 要获取的额外数据源
  199.  * @return mixed
  200.  */
  201. function I($name,$default='',$filter=null,$datas=null) {
  202.         if(strpos($name,'/')){ // 指定修饰符
  203.                 list($name,$type)       =       explode('/',$name,2);
  204.         }
  205.     if(strpos($name,'.')) { // 指定参数来源
  206.         list($method,$name) =   explode('.',$name,2);
  207.     }else{ // 默认为自动判断
  208.         $method =   'param';
  209.     }
  210.     switch(strtolower($method)) {
  211.         case 'get'     :   $input =& $_GET;break;
  212.         case 'post'    :   $input =& $_POST;break;
  213.         case 'put'     :   parse_str(file_get_contents('php://input'), $input);break;
  214.         case 'param'   :
  215.             switch($_SERVER['REQUEST_METHOD']) {
  216.                 case 'POST':
  217.                     $input  =  $_POST;
  218.                     break;
  219.                 case 'PUT':
  220.                     parse_str(file_get_contents('php://input'), $input);
  221.                     break;
  222.                 default:
  223.                     $input  =  $_GET;
  224.             }
  225.             break;
  226.         case 'path'    :  
  227.             $input  =   array();
  228.             if(!empty($_SERVER['PATH_INFO'])){
  229.                 $depr   =   C('URL_PATHINFO_DEPR');
  230.                 $input  =   explode($depr,trim($_SERVER['PATH_INFO'],$depr));            
  231.             }
  232.             break;
  233.         case 'request' :   $input =& $_REQUEST;   break;
  234.         case 'session' :   $input =& $_SESSION;   break;
  235.         case 'cookie'  :   $input =& $_COOKIE;    break;
  236.         case 'server'  :   $input =& $_SERVER;    break;
  237.         case 'globals' :   $input =& $GLOBALS;    break;
  238.         case 'data'    :   $input =& $datas;      break;
  239.         default:
  240.             return NULL;
  241.     }
  242.     if(''==$name) { // 获取全部变量
  243.         $data       =   $input;
  244.         $filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');
  245.         if($filters) {
  246.             if(is_string($filters)){
  247.                 $filters    =   explode(',',$filters);
  248.             }
  249.             foreach($filters as $filter){
  250.                 $data   =   array_map_recursive($filter,$data); // 参数过滤
  251.             }
  252.         }
  253.     }elseif(isset($input[$name])) { // 取值操作
  254.         $data       =   $input[$name];
  255.         $filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');
  256.         if($filters) {
  257.             if(is_string($filters)){
  258.                 $filters    =   explode(',',$filters);
  259.             }elseif(is_int($filters)){
  260.                 $filters    =   array($filters);
  261.             }
  262.            
  263.             foreach($filters as $filter){
  264.                 if(function_exists($filter)) {
  265.                     $data   =   is_array($data) ? array_map_recursive($filter,$data) : $filter($data); // 参数过滤
  266.                 }elseif(0===strpos($filter,'/')){
  267.                         // 支持正则验证
  268.                         if(1 !== preg_match($filter,(string)$data)){
  269.                                 return   isset($default) ? $default : NULL;
  270.                         }
  271.                 }else{
  272.                     $data   =   filter_var($data,is_int($filter) ? $filter : filter_id($filter));
  273.                     if(false === $data) {
  274.                         return   isset($default) ? $default : NULL;
  275.                     }
  276.                 }
  277.             }
  278.         }
  279.         if(!empty($type)){
  280.                 switch(strtolower($type)){
  281.                         case 's':   // 字符串
  282.                                 $data   =       (string)$data;
  283.                                 break;
  284.                         case 'a':       // 数组
  285.                                 $data   =       (array)$data;
  286.                                 break;
  287.                         case 'd':       // 数字
  288.                                 $data   =       (int)$data;
  289.                                 break;
  290.                         case 'f':       // 浮点
  291.                                 $data   =       (float)$data;
  292.                                 break;
  293.                         case 'b':       // 布尔
  294.                                 $data   =       (boolean)$data;
  295.                                 break;
  296.                 }
  297.         }
  298.     }else{ // 变量默认值
  299.         $data       =    isset($default)?$default:NULL;
  300.     }
  301.     is_array($data) && array_walk_recursive($data,'think_filter');
  302.     return $data;
  303. }
  304.  
  305. function array_map_recursive($filter, $data) {
  306.      $result = array();
  307.      foreach ($data as $key => $val) {
  308.          $result[$key] = is_array($val)
  309.              ? array_map_recursive($filter, $val)
  310.              : call_user_func($filter, $val);
  311.      }
  312.      return $result;
  313.  }
  314.  
  315. /**
  316.  * 设置和获取统计数据
  317.  * 使用方法:
  318.  * <code>
  319.  * N('db',1); // 记录数据库操作次数
  320.  * N('read',1); // 记录读取次数
  321.  * echo N('db'); // 获取当前页面数据库的所有操作次数
  322.  * echo N('read'); // 获取当前页面读取次数
  323.  * </code>
  324.  * @param string $key 标识位置
  325.  * @param integer $step 步进值
  326.  * @return mixed
  327.  */
  328. function N($key, $step=0,$save=false) {
  329.     static $_num    = array();
  330.     if (!isset($_num[$key])) {
  331.         $_num[$key] = (false !== $save)? S('N_'.$key) :  0;
  332.     }
  333.     if (empty($step))
  334.         return $_num[$key];
  335.     else
  336.         $_num[$key] = $_num[$key] + (int) $step;
  337.     if(false !== $save){ // 保存结果
  338.         S('N_'.$key,$_num[$key],$save);
  339.     }
  340. }
  341.  
  342. /**
  343.  * 字符串命名风格转换
  344.  * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
  345.  * @param string $name 字符串
  346.  * @param integer $type 转换类型
  347.  * @return string
  348.  */
  349. function parse_name($name, $type=0) {
  350.     if ($type) {
  351.         return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function($match){return strtoupper($match[1]);}, $name));
  352.     } else {
  353.         return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
  354.     }
  355. }
  356.  
  357. /**
  358.  * 优化的require_once
  359.  * @param string $filename 文件地址
  360.  * @return boolean
  361.  */
  362. function require_cache($filename) {
  363.     static $_importFiles = array();
  364.     if (!isset($_importFiles[$filename])) {
  365.         if (file_exists_case($filename)) {
  366.             require $filename;
  367.             $_importFiles[$filename] = true;
  368.         } else {
  369.             $_importFiles[$filename] = false;
  370.         }
  371.     }
  372.     return $_importFiles[$filename];
  373. }
  374.  
  375. /**
  376.  * 区分大小写的文件存在判断
  377.  * @param string $filename 文件地址
  378.  * @return boolean
  379.  */
  380. function file_exists_case($filename) {
  381.     if (is_file($filename)) {
  382.         if (IS_WIN && APP_DEBUG) {
  383.             if (basename(realpath($filename)) != basename($filename))
  384.                 return false;
  385.         }
  386.         return true;
  387.     }
  388.     return false;
  389. }
  390.  
  391. /**
  392.  * 导入所需的类库 同java的Import 本函数有缓存功能
  393.  * @param string $class 类库命名空间字符串
  394.  * @param string $baseUrl 起始路径
  395.  * @param string $ext 导入的文件扩展名
  396.  * @return boolean
  397.  */
  398. function import($class, $baseUrl = '', $ext=EXT) {
  399.     static $_file = array();
  400.     $class = str_replace(array('.', '#'), array('/', '.'), $class);
  401.     if (isset($_file[$class . $baseUrl]))
  402.         return true;
  403.     else
  404.         $_file[$class . $baseUrl] = true;
  405.     $class_strut     = explode('/', $class);
  406.     if (empty($baseUrl)) {
  407.         if ('@' == $class_strut[0] || MODULE_NAME == $class_strut[0]) {
  408.             //加载当前模块的类库
  409.             $baseUrl = MODULE_PATH;
  410.             $class   = substr_replace($class, '', 0, strlen($class_strut[0]) + 1);
  411.         }elseif (in_array($class_strut[0],array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$class_strut[0])) {
  412.             // 系统类库包和第三方类库包
  413.             $baseUrl = LIB_PATH;
  414.         }else { // 加载其他模块的类库
  415.             $baseUrl = APP_PATH;
  416.         }
  417.     }
  418.     if (substr($baseUrl, -1) != '/')
  419.         $baseUrl    .= '/';
  420.     $classfile       = $baseUrl . $class . $ext;
  421.     if (!class_exists(basename($class),false)) {
  422.         // 如果类不存在 则导入类库文件
  423.         return require_cache($classfile);
  424.     }
  425. }
  426.  
  427. /**
  428.  * 基于命名空间方式导入函数库
  429.  * load('@.Util.Array')
  430.  * @param string $name 函数库命名空间字符串
  431.  * @param string $baseUrl 起始路径
  432.  * @param string $ext 导入的文件扩展名
  433.  * @return void
  434.  */
  435. function load($name, $baseUrl='', $ext='.php') {
  436.     $name = str_replace(array('.', '#'), array('/', '.'), $name);
  437.     if (empty($baseUrl)) {
  438.         if (0 === strpos($name, '@/')) {//加载当前模块函数库
  439.             $baseUrl    =   MODULE_PATH.'Common/';
  440.             $name       =   substr($name, 2);
  441.         } else { //加载其他模块函数库
  442.             $array      =   explode('/', $name);
  443.             $baseUrl    =   APP_PATH . array_shift($array).'/Common/';
  444.             $name       =   implode('/',$array);
  445.         }
  446.     }
  447.     if (substr($baseUrl, -1) != '/')
  448.         $baseUrl       .= '/';
  449.     require_cache($baseUrl . $name . $ext);
  450. }
  451.  
  452. /**
  453.  * 快速导入第三方框架类库 所有第三方框架的类库文件统一放到 系统的Vendor目录下面
  454.  * @param string $class 类库
  455.  * @param string $baseUrl 基础目录
  456.  * @param string $ext 类库后缀
  457.  * @return boolean
  458.  */
  459. function vendor($class, $baseUrl = '', $ext='.php') {
  460.     if (empty($baseUrl))
  461.         $baseUrl = VENDOR_PATH;
  462.     return import($class, $baseUrl, $ext);
  463. }
  464.  
  465. /**
  466.  * D函数用于实例化模型类 格式 [资源://][模块/]模型
  467.  * @param string $name 资源地址
  468.  * @param string $layer 模型层名称
  469.  * @return Model
  470.  */
  471. function D($name='',$layer='') {
  472.     if(empty($name)) return new Think\Model;
  473.     static $_model  =   array();
  474.     $layer          =   $layer? : C('DEFAULT_M_LAYER');
  475.     if(isset($_model[$name.$layer]))
  476.         return $_model[$name.$layer];
  477.     $class          =   parse_res_name($name,$layer);
  478.     if(class_exists($class)) {
  479.         $model      =   new $class(basename($name));
  480.     }elseif(false === strpos($name,'/')){
  481.         // 自动加载公共模块下面的模型
  482.         $class      =   '\\Common\\'.$layer.'\\'.$name.$layer;
  483.         $model      =   class_exists($class)? new $class($name) : new Think\Model($name);
  484.     }else {
  485.         Think\Log::record('D方法实例化没找到模型类'.$class,Think\Log::NOTICE);
  486.         $model      =   new Think\Model(basename($name));
  487.     }
  488.     $_model[$name.$layer]  =  $model;
  489.     return $model;
  490. }
  491.  
  492. /**
  493.  * M函数用于实例化一个没有模型文件的Model
  494.  * @param string $name Model名称 支持指定基础模型 例如 MongoModel:User
  495.  * @param string $tablePrefix 表前缀
  496.  * @param mixed $connection 数据库连接信息
  497.  * @return Model
  498.  */
  499. function M($name='', $tablePrefix='',$connection='') {
  500.     static $_model  = array();
  501.     if(strpos($name,':')) {
  502.         list($class,$name)    =  explode(':',$name);
  503.     }else{
  504.         $class      =   'Think\\Model';
  505.     }
  506.     $guid           =   (is_array($connection)?implode('',$connection):$connection).$tablePrefix . $name . '_' . $class;
  507.     if (!isset($_model[$guid]))
  508.         $_model[$guid] = new $class($name,$tablePrefix,$connection);
  509.     return $_model[$guid];
  510. }
  511.  
  512. /**
  513.  * 解析资源地址并导入类库文件
  514.  * 例如 module/controller addon://module/behavior
  515.  * @param string $name 资源地址 格式:[扩展://][模块/]资源名
  516.  * @param string $layer 分层名称
  517.  * @return string
  518.  */
  519. function parse_res_name($name,$layer,$level=1){
  520.     if(strpos($name,'://')) {// 指定扩展资源
  521.         list($extend,$name)  =   explode('://',$name);
  522.     }else{
  523.         $extend  =   '';
  524.     }
  525.     if(strpos($name,'/') && substr_count($name, '/')>=$level){ // 指定模块
  526.         list($module,$name) =  explode('/',$name,2);
  527.     }else{
  528.         $module =   MODULE_NAME;
  529.     }
  530.     $array  =   explode('/',$name);
  531.     $class  =   $module.'\\'.$layer;
  532.     foreach($array as $name){
  533.         $class  .=   '\\'.parse_name($name, 1);
  534.     }
  535.     // 导入资源类库
  536.     if($extend){ // 扩展资源
  537.         $class      =   $extend.'\\'.$class;
  538.     }
  539.     return $class.$layer;
  540. }
  541.  
  542. /**
  543.  * A函数用于实例化控制器 格式:[资源://][模块/]控制器
  544.  * @param string $name 资源地址
  545.  * @param string $layer 控制层名称
  546.  * @param integer $level 控制器层次
  547.  * @return Controller|false
  548.  */
  549. function A($name,$layer='',$level='') {
  550.     static $_action = array();
  551.     $layer  =   $layer? : C('DEFAULT_C_LAYER');
  552.     $level  =   $level? : ($layer == C('DEFAULT_C_LAYER')?C('CONTROLLER_LEVEL'):1);
  553.     if(isset($_action[$name.$layer]))
  554.         return $_action[$name.$layer];
  555.     $class  =   parse_res_name($name,$layer,$level);
  556.     if(class_exists($class)) {
  557.         $action             =   new $class();
  558.         $_action[$name.$layer]     =   $action;
  559.         return $action;
  560.     }else {
  561.         return false;
  562.     }
  563. }
  564.  
  565. /**
  566.  * 远程调用控制器的操作方法 URL 参数格式 [资源://][模块/]控制器/操作
  567.  * @param string $url 调用地址
  568.  * @param string|array $vars 调用参数 支持字符串和数组
  569.  * @param string $layer 要调用的控制层名称
  570.  * @return mixed
  571.  */
  572. function R($url,$vars=array(),$layer='') {
  573.     $info   =   pathinfo($url);
  574.     $action =   $info['basename'];
  575.     $module =   $info['dirname'];
  576.     $class  =   A($module,$layer);
  577.     if($class){
  578.         if(is_string($vars)) {
  579.             parse_str($vars,$vars);
  580.         }
  581.         return call_user_func_array(array(&$class,$action.C('ACTION_SUFFIX')),$vars);
  582.     }else{
  583.         return false;
  584.     }
  585. }
  586.  
  587. /**
  588.  * 执行某个行为
  589.  * @param string $name 行为名称
  590.  * @param Mixed $params 传入的参数
  591.  * @return void
  592.  */
  593. function B($name, &$params=NULL) {
  594.     if(strpos($name,'/')){
  595.         list($name,$tag) = explode('/',$name);
  596.     }else{
  597.         $tag     =   'run';
  598.     }
  599.     return \Think\Hook::exec($name,$tag,$params);
  600. }
  601.  
  602. /**
  603.  * 去除代码中的空白和注释
  604.  * @param string $content 代码内容
  605.  * @return string
  606.  */
  607. function strip_whitespace($content) {
  608.     $stripStr   = '';
  609.     //分析php源码
  610.     $tokens     = token_get_all($content);
  611.     $last_space = false;
  612.     for ($i = 0, $j = count($tokens); $i < $j; $i++) {
  613.         if (is_string($tokens[$i])) {
  614.             $last_space = false;
  615.             $stripStr  .= $tokens[$i];
  616.         } else {
  617.             switch ($tokens[$i][0]) {
  618.                 //过滤各种PHP注释
  619.                 case T_COMMENT:
  620.                 case T_DOC_COMMENT:
  621.                     break;
  622.                 //过滤空格
  623.                 case T_WHITESPACE:
  624.                     if (!$last_space) {
  625.                         $stripStr  .= ' ';
  626.                         $last_space = true;
  627.                     }
  628.                     break;
  629.                 case T_START_HEREDOC:
  630.                     $stripStr .= "<<<THINK\n";
  631.                     break;
  632.                 case T_END_HEREDOC:
  633.                     $stripStr .= "THINK;\n";
  634.                     for($k = $i+1; $k < $j; $k++) {
  635.                         if(is_string($tokens[$k]) && $tokens[$k] == ';') {
  636.                             $i = $k;
  637.                             break;
  638.                         } else if($tokens[$k][0] == T_CLOSE_TAG) {
  639.                             break;
  640.                         }
  641.                     }
  642.                     break;
  643.                 default:
  644.                     $last_space = false;
  645.                     $stripStr  .= $tokens[$i][1];
  646.             }
  647.         }
  648.     }
  649.     return $stripStr;
  650. }
  651.  
  652. /**
  653.  * 浏览器友好的变量输出
  654.  * @param mixed $var 变量
  655.  * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串
  656.  * @param string $label 标签 默认为空
  657.  * @param boolean $strict 是否严谨 默认为true
  658.  * @return void|string
  659.  */
  660. function dump($var, $echo=true, $label=null, $strict=true) {
  661.     $label = ($label === null) ? '' : rtrim($label) . ' ';
  662.     if (!$strict) {
  663.         if (ini_get('html_errors')) {
  664.             $output = print_r($var, true);
  665.             $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
  666.         } else {
  667.             $output = $label . print_r($var, true);
  668.         }
  669.     } else {
  670.         ob_start();
  671.         var_dump($var);
  672.         $output = ob_get_clean();
  673.         if (!extension_loaded('xdebug')) {
  674.             $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
  675.             $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
  676.         }
  677.     }
  678.     if ($echo) {
  679.         echo($output);
  680.         return null;
  681.     }else
  682.         return $output;
  683. }
  684.  
  685. /**
  686.  * URL重定向
  687.  * @param string $url 重定向的URL地址
  688.  * @param integer $time 重定向的等待时间(秒)
  689.  * @param string $msg 重定向前的提示信息
  690.  * @return void
  691.  */
  692. function redirect($url, $time=0, $msg='') {
  693.     //多行URL地址支持
  694.     $url        = str_replace(array("\n", "\r"), '', $url);
  695.     if (empty($msg))
  696.         $msg    = "系统将在{$time}秒之后自动跳转到{$url}!";
  697.     if (!headers_sent()) {
  698.         // redirect
  699.         if (0 === $time) {
  700.             header('Location: ' . $url);
  701.         } else {
  702.             header("refresh:{$time};url={$url}");
  703.             echo($msg);
  704.         }
  705.         exit();
  706.     } else {
  707.         $str    = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
  708.         if ($time != 0)
  709.             $str .= $msg;
  710.         exit($str);
  711.     }
  712. }
  713.  
  714. /**
  715.  * 缓存管理
  716.  * @param mixed $name 缓存名称,如果为数组表示进行缓存设置
  717.  * @param mixed $value 缓存值
  718.  * @param mixed $options 缓存参数
  719.  * @return mixed
  720.  */
  721. function S($name,$value='',$options=null) {
  722.     static $cache   =   '';
  723.     if(is_array($options) && empty($cache)){
  724.         // 缓存操作的同时初始化
  725.         $type       =   isset($options['type'])?$options['type']:'';
  726.         $cache      =   Think\Cache::getInstance($type,$options);
  727.     }elseif(is_array($name)) { // 缓存初始化
  728.         $type       =   isset($name['type'])?$name['type']:'';
  729.         $cache      =   Think\Cache::getInstance($type,$name);
  730.         return $cache;
  731.     }elseif(empty($cache)) { // 自动初始化
  732.         $cache      =   Think\Cache::getInstance();
  733.     }
  734.     if(''=== $value){ // 获取缓存
  735.         return $cache->get($name);
  736.     }elseif(is_null($value)) { // 删除缓存
  737.         return $cache->rm($name);
  738.     }else { // 缓存数据
  739.         if(is_array($options)) {
  740.             $expire     =   isset($options['expire'])?$options['expire']:NULL;
  741.         }else{
  742.             $expire     =   is_numeric($options)?$options:NULL;
  743.         }
  744.         return $cache->set($name, $value, $expire);
  745.     }
  746. }
  747.  
  748. /**
  749.  * 快速文件数据读取和保存 针对简单类型数据 字符串、数组
  750.  * @param string $name 缓存名称
  751.  * @param mixed $value 缓存值
  752.  * @param string $path 缓存路径
  753.  * @return mixed
  754.  */
  755. function F($name, $value='', $path=DATA_PATH) {
  756.     static $_cache  =   array();
  757.     $filename       =   $path . $name . '.php';
  758.     if ('' !== $value) {
  759.         if (is_null($value)) {
  760.             // 删除缓存
  761.             if(false !== strpos($name,'*')){
  762.                 return false; // TODO
  763.             }else{
  764.                 unset($_cache[$name]);
  765.                 return Think\Storage::unlink($filename,'F');
  766.             }
  767.         } else {
  768.             Think\Storage::put($filename,serialize($value),'F');
  769.             // 缓存数据
  770.             $_cache[$name]  =   $value;
  771.             return ;
  772.         }
  773.     }
  774.     // 获取缓存数据
  775.     if (isset($_cache[$name]))
  776.         return $_cache[$name];
  777.     if (Think\Storage::has($filename,'F')){
  778.         $value      =   unserialize(Think\Storage::read($filename,'F'));
  779.         $_cache[$name]  =   $value;
  780.     } else {
  781.         $value          =   false;
  782.     }
  783.     return $value;
  784. }
  785.  
  786. /**
  787.  * 根据PHP各种类型变量生成唯一标识号
  788.  * @param mixed $mix 变量
  789.  * @return string
  790.  */
  791. function to_guid_string($mix) {
  792.     if (is_object($mix)) {
  793.         return spl_object_hash($mix);
  794.     } elseif (is_resource($mix)) {
  795.         $mix = get_resource_type($mix) . strval($mix);
  796.     } else {
  797.         $mix = serialize($mix);
  798.     }
  799.     return md5($mix);
  800. }
  801.  
  802. /**
  803.  * XML编码
  804.  * @param mixed $data 数据
  805.  * @param string $root 根节点名
  806.  * @param string $item 数字索引的子节点名
  807.  * @param string $attr 根节点属性
  808.  * @param string $id   数字索引子节点key转换的属性名
  809.  * @param string $encoding 数据编码
  810.  * @return string
  811.  */
  812. function xml_encode($data, $root='think', $item='item', $attr='', $id='id', $encoding='utf-8') {
  813.     if(is_array($attr)){
  814.         $_attr = array();
  815.         foreach ($attr as $key => $value) {
  816.             $_attr[] = "{$key}=\"{$value}\"";
  817.         }
  818.         $attr = implode(' ', $_attr);
  819.     }
  820.     $attr   = trim($attr);
  821.     $attr   = empty($attr) ? '' : " {$attr}";
  822.     $xml    = "<?xml version=\"1.0\" encoding=\"{$encoding}\"?>";
  823.     $xml   .= "<{$root}{$attr}>";
  824.     $xml   .= data_to_xml($data, $item, $id);
  825.     $xml   .= "</{$root}>";
  826.     return $xml;
  827. }
  828.  
  829. /**
  830.  * 数据XML编码
  831.  * @param mixed  $data 数据
  832.  * @param string $item 数字索引时的节点名称
  833.  * @param string $id   数字索引key转换为的属性名
  834.  * @return string
  835.  */
  836. function data_to_xml($data, $item='item', $id='id') {
  837.     $xml = $attr = '';
  838.     foreach ($data as $key => $val) {
  839.         if(is_numeric($key)){
  840.             $id && $attr = " {$id}=\"{$key}\"";
  841.             $key  = $item;
  842.         }
  843.         $xml    .=  "<{$key}{$attr}>";
  844.         $xml    .=  (is_array($val) || is_object($val)) ? data_to_xml($val, $item, $id) : $val;
  845.         $xml    .=  "</{$key}>";
  846.     }
  847.     return $xml;
  848. }
  849.  
  850. /**
  851.  * session管理函数
  852.  * @param string|array $name session名称 如果为数组则表示进行session设置
  853.  * @param mixed $value session值
  854.  * @return mixed
  855.  */
  856. function session($name,$value='') {
  857.     $prefix   =  C('SESSION_PREFIX');
  858.     if(is_array($name)) { // session初始化 在session_start 之前调用
  859.         if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']);
  860.         if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){
  861.             session_id($_REQUEST[C('VAR_SESSION_ID')]);
  862.         }elseif(isset($name['id'])) {
  863.             session_id($name['id']);
  864.         }
  865.         if('common' != APP_MODE){ // 其它模式可能不支持
  866.             ini_set('session.auto_start', 0);
  867.         }
  868.         if(isset($name['name']))            session_name($name['name']);
  869.         if(isset($name['path']))            session_save_path($name['path']);
  870.         if(isset($name['domain']))          ini_set('session.cookie_domain', $name['domain']);
  871.         if(isset($name['expire']))          ini_set('session.gc_maxlifetime', $name['expire']);
  872.         if(isset($name['use_trans_sid']))   ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0);
  873.         if(isset($name['use_cookies']))     ini_set('session.use_cookies', $name['use_cookies']?1:0);
  874.         if(isset($name['cache_limiter']))   session_cache_limiter($name['cache_limiter']);
  875.         if(isset($name['cache_expire']))    session_cache_expire($name['cache_expire']);
  876.         if(isset($name['type']))            C('SESSION_TYPE',$name['type']);
  877.         if(C('SESSION_TYPE')) { // 读取session驱动
  878.             $type   =   C('SESSION_TYPE');
  879.             $class  =   strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type));
  880.             $hander =   new $class();
  881.             session_set_save_handler(
  882.                 array(&$hander,"open"),
  883.                 array(&$hander,"close"),
  884.                 array(&$hander,"read"),
  885.                 array(&$hander,"write"),
  886.                 array(&$hander,"destroy"),
  887.                 array(&$hander,"gc"));
  888.         }
  889.         // 启动session
  890.         if(C('SESSION_AUTO_START'))  session_start();
  891.     }elseif('' === $value){
  892.         if(0===strpos($name,'[')) { // session 操作
  893.             if('[pause]'==$name){ // 暂停session
  894.                 session_write_close();
  895.             }elseif('[start]'==$name){ // 启动session
  896.                 session_start();
  897.             }elseif('[destroy]'==$name){ // 销毁session
  898.                 $_SESSION =  array();
  899.                 session_unset();
  900.                 session_destroy();
  901.             }elseif('[regenerate]'==$name){ // 重新生成id
  902.                 session_regenerate_id();
  903.             }
  904.         }elseif(0===strpos($name,'?')){ // 检查session
  905.             $name   =  substr($name,1);
  906.             if(strpos($name,'.')){ // 支持数组
  907.                 list($name1,$name2) =   explode('.',$name);
  908.                 return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]);
  909.             }else{
  910.                 return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]);
  911.             }
  912.         }elseif(is_null($name)){ // 清空session
  913.             if($prefix) {
  914.                 unset($_SESSION[$prefix]);
  915.             }else{
  916.                 $_SESSION = array();
  917.             }
  918.         }elseif($prefix){ // 获取session
  919.             if(strpos($name,'.')){
  920.                 list($name1,$name2) =   explode('.',$name);
  921.                 return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null;  
  922.             }else{
  923.                 return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;                
  924.             }            
  925.         }else{
  926.             if(strpos($name,'.')){
  927.                 list($name1,$name2) =   explode('.',$name);
  928.                 return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null;  
  929.             }else{
  930.                 return isset($_SESSION[$name])?$_SESSION[$name]:null;
  931.             }            
  932.         }
  933.     }elseif(is_null($value)){ // 删除session
  934.         if($prefix){
  935.             unset($_SESSION[$prefix][$name]);
  936.         }else{
  937.             unset($_SESSION[$name]);
  938.         }
  939.     }else{ // 设置session
  940.         if($prefix){
  941.             if (!is_array($_SESSION[$prefix])) {
  942.                 $_SESSION[$prefix] = array();
  943.             }
  944.             $_SESSION[$prefix][$name]   =  $value;
  945.         }else{
  946.             $_SESSION[$name]  =  $value;
  947.         }
  948.     }
  949. }
  950.  
  951. /**
  952.  * Cookie 设置、获取、删除
  953.  * @param string $name cookie名称
  954.  * @param mixed $value cookie值
  955.  * @param mixed $options cookie参数
  956.  * @return mixed
  957.  */
  958. function cookie($name, $value='', $option=null) {
  959.     // 默认设置
  960.     $config = array(
  961.         'prefix'    =>  C('COOKIE_PREFIX'), // cookie 名称前缀
  962.         'expire'    =>  C('COOKIE_EXPIRE'), // cookie 保存时间
  963.         'path'      =>  C('COOKIE_PATH'), // cookie 保存路径
  964.         'domain'    =>  C('COOKIE_DOMAIN'), // cookie 有效域名
  965.     );
  966.     // 参数设置(会覆盖黙认设置)
  967.     if (!is_null($option)) {
  968.         if (is_numeric($option))
  969.             $option = array('expire' => $option);
  970.         elseif (is_string($option))
  971.             parse_str($option, $option);
  972.         $config     = array_merge($config, array_change_key_case($option));
  973.     }
  974.     // 清除指定前缀的所有cookie
  975.     if (is_null($name)) {
  976.         if (empty($_COOKIE))
  977.             return;
  978.         // 要删除的cookie前缀,不指定则删除config设置的指定前缀
  979.         $prefix = empty($value) ? $config['prefix'] : $value;
  980.         if (!empty($prefix)) {// 如果前缀为空字符串将不作处理直接返回
  981.             foreach ($_COOKIE as $key => $val) {
  982.                 if (0 === stripos($key, $prefix)) {
  983.                     setcookie($key, '', time() - 3600, $config['path'], $config['domain']);
  984.                     unset($_COOKIE[$key]);
  985.                 }
  986.             }
  987.         }
  988.         return;
  989.     }
  990.     $name = $config['prefix'] . $name;
  991.     if ('' === $value) {
  992.         if(isset($_COOKIE[$name])){
  993.             $value =    $_COOKIE[$name];
  994.             if(0===strpos($value,'think:')){
  995.                 $value  =   substr($value,6);
  996.                 return array_map('urldecode',json_decode(MAGIC_QUOTES_GPC?stripslashes($value):$value,true));
  997.             }else{
  998.                 return $value;
  999.             }
  1000.         }else{
  1001.             return null;
  1002.         }
  1003.     } else {
  1004.         if (is_null($value)) {
  1005.             setcookie($name, '', time() - 3600, $config['path'], $config['domain']);
  1006.             unset($_COOKIE[$name]); // 删除指定cookie
  1007.         } else {
  1008.             // 设置cookie
  1009.             if(is_array($value)){
  1010.                 $value  = 'think:'.json_encode(array_map('urlencode',$value));
  1011.             }
  1012.             $expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0;
  1013.             setcookie($name, $value, $expire, $config['path'], $config['domain']);
  1014.             $_COOKIE[$name] = $value;
  1015.         }
  1016.     }
  1017. }
  1018.  
  1019. /**
  1020.  * 加载动态扩展文件
  1021.  * @return void
  1022.  */
  1023. function load_ext_file($path) {
  1024.     // 加载自定义外部文件
  1025.     if(C('LOAD_EXT_FILE')) {
  1026.         $files      =  explode(',',C('LOAD_EXT_FILE'));
  1027.         foreach ($files as $file){
  1028.             $file   = $path.'Common/'.$file.'.php';
  1029.             if(is_file($file)) include $file;
  1030.         }
  1031.     }
  1032.     // 加载自定义的动态配置文件
  1033.     if(C('LOAD_EXT_CONFIG')) {
  1034.         $configs    =  C('LOAD_EXT_CONFIG');
  1035.         if(is_string($configs)) $configs =  explode(',',$configs);
  1036.         foreach ($configs as $key=>$config){
  1037.             $file   = $path.'Conf/'.$config.'.php';
  1038.             if(is_file($file)) {
  1039.                 is_numeric($key)?C(include $file):C($key,include $file);
  1040.             }
  1041.         }
  1042.     }
  1043. }
  1044.  
  1045. /**
  1046.  * 获取客户端IP地址
  1047.  * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
  1048.  * @return mixed
  1049.  */
  1050. function get_client_ip($type = 0) {
  1051.     $type       =  $type ? 1 : 0;
  1052.     static $ip  =   NULL;
  1053.     if ($ip !== NULL) return $ip[$type];
  1054.     if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  1055.         $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
  1056.         $pos    =   array_search('unknown',$arr);
  1057.         if(false !== $pos) unset($arr[$pos]);
  1058.         $ip     =   trim($arr[0]);
  1059.     }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
  1060.         $ip     =   $_SERVER['HTTP_CLIENT_IP'];
  1061.     }elseif (isset($_SERVER['REMOTE_ADDR'])) {
  1062.         $ip     =   $_SERVER['REMOTE_ADDR'];
  1063.     }
  1064.     // IP地址合法验证
  1065.     $long = sprintf("%u",ip2long($ip));
  1066.     $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
  1067.     return $ip[$type];
  1068. }
  1069.  
  1070. /**
  1071.  * 发送HTTP状态
  1072.  * @param integer $code 状态码
  1073.  * @return void
  1074.  */
  1075. function send_http_status($code) {
  1076.     static $_status = array(
  1077.         // Success 2xx
  1078.         200 => 'OK',
  1079.         // Redirection 3xx
  1080.         301 => 'Moved Permanently',
  1081.         302 => 'Moved Temporarily ',  // 1.1
  1082.         // Client Error 4xx
  1083.         400 => 'Bad Request',
  1084.         403 => 'Forbidden',
  1085.         404 => 'Not Found',
  1086.         // Server Error 5xx
  1087.         500 => 'Internal Server Error',
  1088.         503 => 'Service Unavailable',
  1089.     );
  1090.     if(isset($_status[$code])) {
  1091.         header('HTTP/1.1 '.$code.' '.$_status[$code]);
  1092.         // 确保FastCGI模式下正常
  1093.         header('Status:'.$code.' '.$_status[$code]);
  1094.     }
  1095. }
  1096.  
  1097. // 不区分大小写的in_array实现
  1098. function in_array_case($value,$array){
  1099.     return in_array(strtolower($value),array_map('strtolower',$array));
  1100. }
  1101.  
  1102. function think_filter(&$value){
  1103.         // TODO 其他安全过滤
  1104.  
  1105.         // 过滤查询特殊字符
  1106.     if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){
  1107.         $value .= ' ';
  1108.     }
  1109. }
downloadfunctions.php Source code - Download The latest thinkphp v5.2 work order system Source code
Related Source Codes/Software:
V3.3.6 Workerman high-performance PHP Socket (framework) - High performance PHP Socket framework Workerman re... 2017-05-03
The phosphor meeting room reservation system MRBS (loop reservation v16.0) - The phosphor meeting room reservation system MRBS ... 2017-05-03
IDC v5.2.3 agent center - IDC Centre IDC for exploitation is a PHP+MySQL age... 2017-05-03
Zen master v9.0.1 project management software - Zen is the first domestic open source project mana... 2017-05-03
Ray speed v7.03 employee files management system - Employee files project is various, and some conten... 2017-05-03
HITCMS Haitian responsive electronic mechanical v3.0 foreign trade website source code - HITCMS Haitian response electronic machinery trade... 2017-05-03
Ray v7.02 speed survey system - Lightning speed survey system is a. NET+MSSQL deve... 2017-05-03
Cool HITCMS reactive black v3.0 enterprise website source code - HITCMS-Haitian response black enterprises website ... 2017-05-03
WebOA v17.2 network office automation system - WebOA network using b/s structure development of o... 2017-05-03
Pure imitation of han site source code, one a 】 【 c9cms kernel v1.0 - Generic http://www.wufazhuce.com/Han one · Config... 2017-05-04
zone.js - Implements Zones for JavaScript ... 2017-05-11
dragonfly - A Ruby gem for on-the-fly processing - suitable fo... 2017-05-11
oh-my-fish - The Fishshell Framework. 2017-05-11
canvas-lms - The open LMS by Instructure, Inc. 2017-05-11
ledger - Double-entry accounting system with a command-line... 2017-05-11
Python - My Python Examples http://w... 2017-05-11
blade - 2017-05-11
LaZagne - Credentials recovery project 2017-05-10
Pull-to-Refresh.Rentals-iOS - This project aims to provide a simple and customiz... 2017-05-10
spoon - Distributing instrumentation tests to all your And... 2017-05-10

 Back to top