<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 应用公共文件
use app\common\model\Plugin;
use app\common\model\Module;
use app\common\model\User AS UserModel;
use app\common\model\Msg AS MsgModel;
use think\Db;
use think\Request;
use app\common\controller\Base;
use app\common\util\Cache2;
error_reporting(E_ERROR | E_PARSE );
if (is_file(APP_PATH.'function.php')) { //用户二开的方法优先级更高,可以把下面默认的替换掉
include_once APP_PATH.'function.php';
}
if(!function_exists('fun')){
/**
* 扩展函数,第一项是函数文件名@方法名,之后可以设置任意多项参数,它会对应到你自己定义的函数,比如这里第二项,会对应到你的函数第一项
* 注意,唯一不足的是:用不了引用参数
* @param string $fun 文件名@方法名
* @return void|mixed
*/
function fun($fun='sort@get'){
static $fun_array = [];
list($class_name,$action) = explode('@',$fun);
$class = "app\\common\\fun\\".ucfirst($class_name);
$obj = $fun_array[$class_name];
if(empty($obj)){
if(!class_exists($class)){
return ;
}
$obj = $fun_array[$class_name] = new $class;
}
if(!method_exists($obj, $action)){
return ;
}
$params = func_get_args();
unset($params[0]);
$params = array_values($params);
static $default_params_array = [];
$_params = $default_params_array[$fun];
if (!isset($_params)) {
$_params = [];
$_obj = new \ReflectionMethod($obj, $action);
$_array = $_obj->getParameters();
foreach($_array AS $key=>$value){
if($value->isOptional()){
$_params[$key] = $value->getDefaultValue();
}else{
$_params[$key] = null;
}
}
$default_params_array[$fun] = $_params;
}
foreach($_params AS $key=>$value){
if(isset($params[$key])){
$_params[$key] = $params[$key];
}
}
return call_user_func_array([$obj, $action], $_params); //这个函数没办法处理传递引用参数 func_get_args 也是变量的复制,没办法传递
// try {
// $reuslt = $_obj->invokeArgs($obj, $_params);
// } catch(\Exception $e) {
// $_params[0] = &$quote;
// arsort($_params);
// $reuslt = $_obj->invokeArgs($obj, $_params);
// }
// return $reuslt;
//return call_user_func_array([$obj, $action], $_params); //这个函数没办法处理传递引用参数
}
}
if (!function_exists('get_real_path')) {
/**
* 解决有的虚拟服务器不支持../这样的相对路径的问题
* @param unknown $path
* @return string
*/
function get_real_path($path) {
if(!strstr($path,'..')){
return $path;
}
$path = str_replace('\\','/',$path);
$path = str_replace('//','/',$path);
$detail = explode('/',$path);
foreach($detail AS $key=>$value){
if($value=='.'||$value===''){
unset($detail[$key]);
}
}
$detail = array_values($detail);
$max = count($detail)-1;
for($i=$max;$i>=0;$i--){
if (!isset($detail[$i])) {
continue;
}
if($detail[$i]=='..'){
unset($detail[$i]);
if($detail[$i-1]=='..'){
if($detail[$i-2]=='..'){
if($detail[$i-3]=='..'){
unset($detail[$i-6]);
unset($detail[$i-7]);
}
unset($detail[$i-4]);
unset($detail[$i-5]);
}
unset($detail[$i-2]);
unset($detail[$i-3]);
}
unset($detail[$i-1]);
}
}
return (substr($path,0,1)=='/'?'/':'').implode('/',$detail);
}
}
if (!function_exists('clear_js')) {
/**
* 过滤js内容
* @param string $str 要过滤的字符串
* @return mixed|string
*/
function clear_js($str = '')
{
$search ="/<script[^>]*?>.*?<\/script>/si";
$str = preg_replace($search, '', $str);
return $str;
}
}
if (!function_exists('hook_listen')) {
/**
* 监听标签的行为
* 钩子若执行错误,错误日志会写在 runtime\hook_run_error.php 这个文件里边
* @param string $tag 标签名称
* @param mixed $params 传入参数
* @param mixed $extra 额外参数
* @param bool $once 只获取一个有效返回值
* @return string|mixed|mixed[]
*/
function hook_listen($tag = '', &$params = null, $extra = null, $once = false) {
if ($once===true && hook_if_load($tag)===false) { //这个纯属是为了兼容以前的模板中放的钩子
get_hook($tag,$params,$extra,['from'=>'hook'],$once);
}
try {
$result = \think\Hook::listen($tag, $params, $extra, $once);
} catch(\Exception $e) {
if($e->getCode()===0||$e->getCode()===1){ //成功或报错页,即$this->error('');与$this->success('');
throw $e;
}else{
//钩子若执行错误,错误日志会写在 runtime\hook_run_error.php 这个文件里边
file_put_contents(RUNTIME_PATH.'hook_run_error.php', '<?php die();'.var_export($e,true)."\r\n$tag\r\n" );
}
}
return $result;
}
}
if (!function_exists('hook_if_load')) {
/**
* 检查是否重复加载钩子
* @param string $tag
* @return boolean
*/
function hook_if_load($tag=''){
static $array = [];
if ($array[$tag]) {
return true;
}else{
$array[$tag] = true;
return false;
}
}
}
if (!function_exists('get_hook')) {
/**
* 齐博首创 钩子文件扩展接口
* 详细使用教程 https://www.kancloud.cn/php168/x1_of_qibo/1010065
* @param string $type 钩子标志,不能重复
* @param array $data POST表单数据
* @param array $info 数据库资料
* @param array $array 其它参数
* @param string $use_common 默认同时调用全站通用的
* @param string $dirname 可以指定模块目录,比如在模型里边被其它调用的话,就需要预先指定目录,避免获取不到真实目录
* @return unknown|NULL
*/
function get_hook($type='',&$data=[],$info=[],$array=[],$use_common=true,$dirname=''){
if (hook_if_load($type)===true && $array['from']!='hook') {
return NULL;
}
$path_array = [];
$dirname = $dirname?:config('system_dirname');
if ( empty($dirname) ) {
if (defined('IN_PLUGIN')) {
$dirname = input
Java程序员-张凯
- 粉丝: 1w+
- 资源: 7525
最新资源
- 飞行汽车发展的关键技术和创新
- 离网下三相不平衡负载,基于下垂控制的T型三电平逆变器,采用正负序分离四环控制,正序电压电流双闭环,负序电压电流双闭环,中点电位平衡控制,采用SPWM调制 1.提供下垂控制原理,参数计算方法以及相关文
- PikaPython 是一个完全重写的超轻量级python引擎,零依赖,零配置,可以在少于4KB的RAM下运行(如stm32g030c8和stm32f103c8),极易部署和扩展
- comsol瓦斯抽采数值模拟comsol 流固耦合数值模型
- 2-NP管理器V3.1.13 APK反编译等安卓逆向功能
- 基于S7-200 PLC和组态王组态切片机控制系统 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面
- 相间soc均衡,相内soc均衡,级联H桥储能,储能变器,零序电压注入法,负序电压注入法,解耦控制,单极倍频载波移相调制,蓄电池充放电控制
- 大雾天气识别数据集,1012张图,使用PASICAL VOC XML格式标注
- 大雾天气识别数据集,1012张图,使用 COCO JSON格式标注
- 大雾天气识别数据集,1012张图,使用yolov7pytorch格式标注
- 大雾天气识别数据集,1012张图,使用yolov8格式标注
- 大雾天气识别数据集,1012张图,使用yolov5格式标注
- 大雾天气识别数据集,1012张图,使用yolov9格式标注
- 大雾天气识别数据集,1012张图,使用yolov11格式标注
- 2-自动隐藏和显示桌面图标v6.27绿色版
- Comsol声子晶体能带计算,包含六角晶格不同原胞的选取以及简约布里渊区高对称点选择 核心在于区分三角晶格和六角晶格区别
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈