set($key, $value); return true; } else { return \top\library\Config::instance()->get($key); } } /** * 请求类 * @return \top\library\http\Request */ function request() { return \top\library\http\Request::instance(); } /** * 响应类 * @return \top\library\http\Response */ function response() { return \top\library\http\Response::instance(); } /** * 调用模型 * @param $name * @return \top\library\Model */ function model($name) { static $model = []; $class = class_full_name($name, 'model'); if (!isset($model[$class])) { // 模型类存在则直接实例化 // 模型类不存在则直接将传入的模型名当作表名处理 if (class_exists($class)) { $model[$class] = new $class(); } else { $model[$class] = new \top\library\Model($name); } } return $model[$class]; } /** * 调用逻辑 * @param $name * @return mixed */ function logic($name) { static $logic = []; $class = class_full_name($name, 'logic'); if (!isset($logic[$class])) { // 实例化逻辑类 $logic[$class] = new $class(); } return $logic[$class]; } /** * 获取类全限定名 * @param $name * @param string $type * @return string */ function class_full_name($name, $type = 'model') { if (!strstr($name, '\\')) { // 不是类全限定名,则直接拼接全限定名 return APP_NS . '\\' . BIND_MODULE . '\\' . $type . '\\' . $name; } else return $name; } /** * 拼接链接(暂时先这样 * @param string $url * @param string|int $param * @return string */ function url($url, $param = '') { if (!empty($param) || is_numeric($param)) { if (is_array($param)) { $param = '/' . implode('/', $param); } else { $param = '/' . $param; } } $url = ltrim($url, '/'); return '/' . $url . $param . '.html'; } /** * 获取当前视图文件的缓存标识 * @return string */ function view_cache_ident() { $ident = md5($_SERVER['REQUEST_URI'] . request()->requestMethod()); return $ident; } /** * 设置视图缓存时间 * @param $sec */ function view_cache($sec) { \top\library\View::instance()->cache($sec); } /** * 参数传递 * @param $name * @param $value */ function view_param($name, $value) { \top\library\View::instance()->param($name, $value); } /** * 显示视图 * @param string $file * @param array $param * @param bool $cache * @return mixed */ function view($file = '', $param = [], $cache = false) { return \top\library\View::instance()->fetch($file, $param, $cache); } /** * 页面跳转 * @param $url * @return false|string */ function redirect($url) { if (request()->is('ajax')) { return json_encode([ 'redirect' => $url, ]); } else { header('location: ' . $url); } } /** * 框架session操作 * @param $name * @param string $value * @return bool * @throws Exception */ function session($name, $value = '') { $config = config('session'); if (empty($config) || !$config['prefix']) { $prefix = request()->module(); } else { $prefix = $config['prefix']; } if ($value === '') { if (isset($_SESSION[$prefix][$name])) { return $_SESSION[$prefix][$name]; } return false; } else if ($value === false) { unset($_SESSION[$prefix][$name]); } else { $_SESSION[$prefix][$name] = $value; } } /** * 获取headers * @return array|false */ function get_header() { if (PHP_SAPI === 'apache2handler') { $headers = getallheaders(); $data = []; foreach ($headers as $key => $value) { $data[strtolower($key)] = $value; } unset($headers); return $data; } else { $server = $_SERVER; $headers = []; foreach ($server as $key => $value) { if ('http_' == strtolower(substr($key, 0, 5))) { $headers[strtolower(substr($key, 5))] = $value; } } unset($server); return $headers; } } /** * 获取表名 * @param $classname * @return string */ function get_table_name($classname) { $arr = explode('\\', $classname); $class = end($arr); $arr = str_split($class); for ($i = 0; $i < count($arr); $i++) { $ord = ord($arr[$i]); if ($ord > 64 && $ord < 91 && $i != 0) { $arr[$i - 1] = $arr[$i - 1] . '_'; } } $table = implode('', $arr); return strtolower($table); } /** * 获取客户端IP * @param int $type * @param bool $client * @return mixed */ function get_client_ip($type = 0, $client = true) { $type = $type ? 1 : 0; static $ip = NULL; if ($ip !== NULL) return $ip[$type]; if ($client) { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $pos = array_search('unknown', $arr); if (false !== $pos) { unset($arr[$pos]); } $ip = trim($arr[0]); } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } } elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } $long = sprintf("%u", ip2long($ip)); $ip = $long ? [ $ip, $long ] : [ '0.0.0.0', 0 ]; return $ip[$type]; } /** * 创建HTTP请求 * @param $url * @param array $data * @param array $header * @return bool|mixed */ function create_http_request($url, $data = [], $header = []) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); if (!empty($data)) { curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, $header); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($curl); if (!empty($header)) { $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); $response = substr($response, $headerSize); } curl_close($curl); if ($response) { return $response; } return false; } /** * 删除目录(包括子目录) * @param string $dirName */ function remove_dir($dirName) { $handle = @opendir($dirName); if ($handle) { while (false !== ($item = readdir($handle))) { if ($item != "." && $item != "..") { if (is_dir($dirName . '/' . $item)) { remove_dir($dirName . '/' . $item); } else { unlink($dirName . '/' . $item); } } } closedir($handle); rmdir($dirName); } } /** * 过滤字符串 * @param string $str * @return string */ function filter($str) { $replaceArr = array( "/select\b|insert\b|update\b|delete\b|drop\b|;|\"|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dump/is" ); $str = preg_replace($replaceArr, '', $str); $str = htmlspecialchars($str); return $str; } /** * 过滤数组 * @param array $array * @param string $filter * @param array $result */ function filter_array($array = [], $filter = 'filter', &$result = []) { foreach ($array as $key => $value) { if (is_array($value)) { filter_array($value, $result[$key]); } else { $result[$key] = (!$filter) ? $value : $filter($value); } } } /** * 二维数组排序操作 * @param $arr * @param $key * @return mixed */ function assoc_unique($arr, $key) { $tmp_arr = []; foreach ($arr as $k => $v) { if (in_array($v[$key], $tmp_arr)) {//搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true unset($arr[$k]); } else { $tmp_arr[] = $v[$key]; } } // sort($arr); //sort函数对数组进行排序 return $arr; } /** * 改变图片大小 * @param $imgSrc * @param $resize_width * @param $resize_height * @param string $newName * @param bool $isCut * @return string */ function resize_image($imgSrc, $resize_width, $resize_height, $newName = '', $isCut = false) { $im = @imagecreatefromstring(file_get_contents($imgSrc)); $exif = exif_read_data($imgSrc); if (!empty($exif['Orientation'])) { switch ($exif['Orientation']) { case 8: $im = imagerotate($im, 90, 0); break; case 3: $im = imagerotate($im, 180, 0); break; case 6: $im = imagerotate($im, -90, 0); break; default: } } //图片的类型 $type = substr(strrchr($imgSrc, "."), 1); //目标图象地址 $dstimg = (!$newName) ? $imgSrc : $newName . '.' . $type; $width = imagesx($im); $height = imagesy($im); //生成图象 //改变后的图象的比例 $resize_ratio = ($resize_width) / ($resize_height); //实际图象的比例 $ratio = ($width) / ($height); if (($isCut) == 1) { //裁图 if ($ratio >= $resize_ratio) { //高度优先 $newimg = imagecreatetruecolor($resize_width, $resize_height); imagecopyresampled($newimg, $im, 0, 0, 0, 0, $resize_width, $resize_height, (($height) * $resize_ratio), $height); ImageJpeg($newimg, $dstimg); } if ($ratio < $resize_ratio) { //宽度优先 $newimg = imagecreatetruecolor($resize_width, $resize_height); imagecopyresampled($newimg, $im, 0, 0, 0, 0, $resize_width, $resize_height, $width, (($width) / $resize_ratio)); ImageJpeg($newimg, $dstimg); } } else { //不裁图 if ($ratio >= $resize_ratio) { $newimg = imagecreatetruecolor($resize_width, ($resize_width) / $ratio); imagecopyresampled($newimg, $im, 0, 0, 0, 0, $resize_width, ($resize_width) / $ratio, $width, $height); ImageJpeg($newimg, $dstimg); } if ($ratio < $resize_ratio) { $newimg = imagecreatetruecolor(($resize_height) * $ratio, $resize_height); imagecopyresampled($newimg, $im, 0, 0, 0, 0, ($resize_height) * $ratio, $resize_height, $width, $height); ImageJpeg($newimg, $dstimg); } } ImageDestroy($im); //imgturn($dstimg, 1); return $dstimg; } /** * 判断是否是移动端 * @return bool */ function is_mobile() { // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) { return true; } // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息 if (isset ($_SERVER['HTTP_VIA'])) { // 找不到为flase,否则为true return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false; } // 脑残法,判断手机发送的客户端标志,兼容性有待提高 if (isset ($_SERVER['HTTP_USER_AGENT'])) { $clientkeywords = [ 'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile' ]; // 从HTTP_USER_AGENT中查找手机浏览器的关键字 if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) { return true; } } // 协议法,因为有可能不准确,放到最后判断 if (isset ($_SERVER['HTTP_ACCEPT'])) { // 如果只支持wml并且不支持html那一定是移动设备 // 如果支持wml和html但是wml在html之前则是移动设备 if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) { return true; } } return false; } // 模型自动验证函数 /** * 检查是否为空 * * @param string|array $value * @return boolean */ function notNull($value) { if (is_array($value)) { if (empty($value)) { return false; } } else { if (!$value && !is_numeric($value)) { return false; } } return true; } /** * 预置不等于判断 * @param $value * @param $value1 * @return bool */ function notEqual($value, $value1) { if ($value == $value1) { return false; } return true; } /** * 长度判断 * * @param string $value * @param int $min * @param int $max * @return boolean */ function length($value, $min, $max) { $length = mb_strlen($value, 'utf8'); if ($length < $min || $length > $max) { return false; } return true; }