PHP常用的类封装小结【4个工具类】


Posted in PHP onJune 28, 2019

本文实例讲述了PHP常用的类封装。分享给大家供大家参考,具体如下:

这4个类分别是Mysql类、 分页类、缩略图类、上传类。

Mysql类

<?php
/**
 * Mysql类
 */
class Mysql{
  private static $link = null;//数据库连接
  /**
   * 私有的构造方法
   */
  private function __construct(){}
  /**
   * 连接数据库
   * @return obj 资源对象
   */
  private static function conn(){
    if(self::$link === null){
      $cfg = require './config.php';
      self::$link = new Mysqli($cfg['host'],$cfg['user'],$cfg['pwd'],$cfg['db']);
      self::query("set names ".$cfg['charset']);//设置字符集
    }
    return self::$link;
  }
  /**
   * 执行一条sql语句
   * @param str $sql 查询语句
   * @return obj   结果集对象
   */
  public static function query($sql){
    return self::conn()->query($sql);
  }
  /**
   * 获取多行数据
   * @param str $sql 查询语句
   * @return arr   多行数据
   */
  public static function getAll($sql){
    $data = array();
    $res = self::query($sql);
    while($row = $res->fetch_assoc()){
      $data[] = $row;
    }
    return $data;
  }
  /**
   * 获取一行数据
   * @param str $row 查询语句
   * @return arr   单行数据
   */
  public static function getRow($row){
    $res = self::query($sql);
    return $res->fetch_assoc();
  }
  /**
   * 获取单个结果
   * @param str $sql 查询语句
   * @return str   单个结果
   */
  public static function getOne($sql){
    $res = self::query($sql);
    $data = $res->fetch_row();
    return $data[0];
  }
  /**
   * 插入/更新数据
   * @param str $table 表名
   * @param arr $data 插入/更新的数据
   * @param str $act  insert/update
   * @param str $where 更新条件
   * @return bool 插入/更新是否成功
   */
  public static function exec($table,$data,$act='insert',$where='0'){
    //插入操作
    if($act == 'insert'){
      $sql = 'insert into '.$table;
      $sql .= ' ('.implode(',',array_keys($data)).')';
      $sql .= " values ('".implode("','",array_values($data))."')";
    }else if($act == 'update'){
      $sql = 'update '.$table.' set ';
      foreach ($data as $k => $v) {
        $sql .= $k.'='."'$v',";
      }
      $sql = rtrim($sql,',');
      $sql .= ' where 1 and '.$where;
    }
    return self::query($sql);
  }
  /**
   * 获取最近一次插入的主键值
   * @return int 主键
   */
  public static function getLastId(){
    return self::conn()->insert_id;
  }
  /**
   * 获取最近一次操作影响的行数
   * @return int 影响的行数
   */
  public static function getAffectedRows(){
    return self::conn()->affected_rows;
  }
  /**
   * 关闭数据库连接
   * @return bool 是否关闭
   */
  public static function close(){
    return self::conn()->close();
  }
}
?>

分页类

<?php
/**
 * 分页类
 * @author webbc
 */
class Page{
  private $num;//总的文章数
  private $cnt;//每页显示的文章数
  private $curr;//当前的页码数
  private $p = 'page';//分页参数名
  private $pageCnt = 5;//分栏总共显示的页数
  private $firstRow;//每页的第一行数据
  private $pageIndex = array();//分页信息
  /**
   * 构造函数
   * @param int $num 总的文章数
   * @param int $cnt 每页显示的文章数
   */
  public function __construct($num,$cnt=10){
    $this->num = $num;
    $this->cnt = $cnt;
    $this->curr = empty($_GET[$this->p]) ? 1 : intval($_GET[$this->p]);
    $this->curr = $this->curr > 0 ? $this->curr : 1;
    $this->firstRow  = $this->cnt * ($this->curr - 1);
    $this->getPage();
  }
  /**
   * 分页方法
   */
  private function getPage(){
    $page = ceil($this->num / $this->cnt);//总的页数
    $left = max(1,$this->curr - floor($this->pageCnt/2));//计算最左边页码
    $right = min($left + $this->pageCnt - 1 ,$page);//计算最右边页码
    $left = max(1,$right - ($this->pageCnt - 1));//当前页码往右靠,需要重新计算左边页面的值
    for($i=$left;$i<=$right;$i++){
      if($i == 1){
        $index = '第1页';
      }else if($i == $page){
        $index = '最后一页';
      }else{
        $index = '第'.$i.'页';
      }
      $_GET['page'] = $i;
      $this->pageIndex[$index] = http_build_query($_GET);
    }
  }
  /**
   * 返回分页信息数据
   * @return [type] [description]
   */
  public function show(){
    return $this->pageIndex;
  }
}
?>

缩略图类

<?php
/**
 * 缩略图类
 * @author webbc
 */
class Thumb{
  private $thumbWidth;//缩略图的宽
  private $thumbHeight;//缩略图的高
  private $thumbPath;//缩略图保存的路径
  private $sourcePath;//原图的路径
  private $sourceWidth;//原图的宽度
  private $sourceHeight;//原图的高度
  private $sourceType;//原图的图片类型
  /**
   * 构造函数
   * @param str $sourcePath 原图的绝对路径
   * @param integer $thumbWidth 缩略图的宽
   * @param integer $thumbHeight 缩略图的高
   */
  public function __construct($sourcePath,$thumbWidth=200,$thumbHeight=200){
    //获取原图的绝对路径
    $this->sourcePath = $sourcePath;
    //获取缩略图的大小
    $this->thumbWidth = $thumbWidth;
    $this->thumbHeight = $thumbHeight;
    $this->thumbPath = $this->getThumbPath();
    //计算大图的大小
    list($this->sourceWidth,$this->sourceHeight,$this->sourceType) = getimagesize($this->sourcePath);
  }
  /**
   * 确定缩略图保存的路径
   * @return [type] [description]
   */
  private function getThumbPath(){
    $ext = $this->getExt();
    $filename = basename($this->sourcePath,'.'.$ext).'_thumb'.'.'.$ext;
    return $thumbPath = __DIR__.'/'.$filename;
  }
  /**
   * 获取原图的扩展名
   * @return str 扩展名
   */
  private function getExt(){
    return pathinfo($this->sourcePath,PATHINFO_EXTENSION);
  }
  /**
   * 检测原图的扩展名是否合法,并返回相应类型
   * @return bool/str 原图的类型
   */
  public function getType(){
    $typeArr = array(
      1 => 'gif',
      2 => 'jpeg',
      3 => 'png',
      15 => 'wbmp'
    );
    if(!in_array($this->sourceType, array_keys($typeArr))){
      return false;
    }
    return $typeArr[$this->sourceType];
  }
  /**
   * 按照缩略图大小,计算大图的缩放比例
   * @return float 缩放比例
   */
  public function calculateRate(){
    return min($this->thumbWidth / $this->sourceWidth,$this->thumbHeight / $this->sourceHeight);
  }
  /**
   * 计算大图按照缩放比例后,最终的图像大小
   * @param float $rate 缩放比例
   * @return arr 缩放后的图片大小
   */
  public function getImageSizeByRate($rate){
    $width = $this->sourceWidth * $rate;
    $height = $this->sourceHeight * $rate;
    return array('w'=>$width,'h'=>$height);
  }
  /**
   * 保存成文件
   * @return [type] [description]
   */
  public function saveFile($image){
    $method = "image".$this->getType();
    $method($image,$this->thumbPath);
  }
  /**
   * 进行绘画操作
   * @return [type] [description]
   */
  public function draw(){
    if(!($type = $this->getType())){
      echo "文件类型不支持";
      return ;
    }
    //创建大图和小图的画布
    $method = "imagecreatefrom".$type;
    $bigCanvas = $method($this->sourcePath);
    $smallCanvas = imagecreatetruecolor($this->thumbWidth, $this->thumbHeight);
    //创建白色画笔,并给小图画布填充背景
    $white = imagecolorallocate($smallCanvas, 255, 255, 255);
    imagefill($smallCanvas, 0, 0, $white);
    //计算大图的缩放比例
    $rate = $this->calculateRate();
    //计算大图缩放后的大小信息
    $info = $this->getImageSizeByRate($rate);
    //进行缩放
    imagecopyresampled($smallCanvas, $bigCanvas,
      ($this->thumbWidth - $info['w']) / 2 , ($this->thumbHeight - $info['h']) / 2,
      0, 0, $info['w'], $info['h'], $this->sourceWidth, $this->sourceHeight);
    //保存成文件
    $this->saveFile($smallCanvas);
    //销毁画布
    imagedestroy($bigCanvas);
    imagedestroy($smallCanvas);
  }
}
?>

上传类

<meta charset="utf8"/>
<?php
/**
 * 文件上传类
 * @author webbc
 */
class Upload{
  private $allowExt = array('gif','jpg','jpeg','bmp','png','swf');//限制文件上传的后缀名
  private $maxSize = 1;//限制最大文件上传1M
  /**
   * 获取文件的信息
   * @param str $flag 上传文件的标识
   * @return arr    上传文件的信息数组
   */
  public function getInfo($flag){
    return $_FILES[$flag];
  }
  /**
   * 获取文件的扩展名
   * @param str $filename 文件名
   * @return str 文件扩展名
   */
  public function getExt($filename){
    return pathinfo($filename,PATHINFO_EXTENSION);
  }
  /**
   * 检测文件扩展名是否合法
   * @param str $filename 文件名
   * @return bool 文件扩展名是否合法
   */
  private function checkExt($filename){
    $ext = $this->getExt($filename);
    return in_array($ext,$this->allowExt);
  }
  /**
   * 检测文件大小是否超过限制
   * @param int size 文件大小
   * @return bool 文件大小是否超过限制
   */
  public function checkSize($size){
    return $size < $this->maxSize * 1024 * 1024;
  }
  /**
   * 随机的文件名
   * @param int $len 随机文件名的长度
   * @return str 随机字符串
   */
  public function randName($len=6){
    return substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ234565789'),0,$len);
  }
  /**
   * 创建文件上传到的路径
   * @return str 文件上传的路径
   */
  public function createDir(){
    $dir = './upload/'.date('Y/m/d',time());
    if(is_dir($dir) || mkdir($dir,0777,true)){
      return $dir;
    }
  }
  /**
   * 文件上传
   * @param str $flag 文件上传标识
   * @return arr 文件上传信息
   */
  public function uploadFile($flag){
    if($_FILES[$flag]['name'] === '' || $_FILES[$flag]['error'] !== 0){
      echo "没有上传文件";
      return;
    }
    $info = $this->getInfo($flag);
    if(!$this->checkExt($info['name'])){
      echo "不支持的文件类型";
      return;
    }
    if(!$this->checkSize($info['size'])){
      echo "文件大小超过限制";
      return;
    }
    $filename = $this->randName().'.'.$this->getExt($info['name']);
    $dir = $this->createDir();
    if(!move_uploaded_file($info['tmp_name'], $dir.'/'.$filename)){
      echo "文件上传失败";
    }else{
      return array('filename'=>$filename,'dir'=>$dir);
    }
  }
}
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
如何对PHP程序中的常见漏洞进行攻击(上)
Oct 09 PHP
PHP 5.0对象模型深度探索之对象复制
Mar 27 PHP
php定时删除文件夹下文件(清理缓存文件)
Jan 23 PHP
深入php socket的讲解与实例分析
Jun 13 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 PHP
php实现数组筛选奇数和偶数示例
Apr 11 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
Jun 27 PHP
深入讲解PHP的Yii框架中的属性(Property)
Mar 18 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 PHP
php array_chunk()函数用法与注意事项
Jul 12 PHP
PHP实现常用排序算法的方法
Feb 05 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
php实现网页上一页下一页翻页过程详解
Jun 28 #PHP
php输出控制函数和输出函数生成静态页面
Jun 27 #PHP
php生成静态页面并实现预览功能
Jun 27 #PHP
PHP创建对象的六种方式实例总结
Jun 27 #PHP
PHP实现的抓取小说网站内容功能示例
Jun 27 #PHP
不常用但很实用的PHP预定义变量分析
Jun 25 #PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 #PHP
You might like
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
JavaScript 基本概念
2015/01/20 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
2017/02/22 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
2018/02/21 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
wxPython窗口中文乱码解决方法
2014/10/11 Python
Python操作MySQL数据库9个实用实例
2015/12/11 Python
Python实现的双色球生成功能示例
2017/12/18 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
python中copy()与deepcopy()的区别小结
2018/08/03 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
英国最大的笔记本电脑直销专家:Laptops Direct
2019/07/20 全球购物
就业自我评价
2014/02/04 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
个人授权委托书模板
2014/09/14 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
2014年体育部工作总结
2014/11/13 职场文书
2014财务年终工作总结
2014/12/08 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
总结一些Java常用的加密算法
2021/06/11 Java/Android