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 has encountered an Access Violation
Jan 15 PHP
破解图片防盗链的代码(asp/php)测试通过
Jul 02 PHP
php checkbox 取值详细说明
Aug 19 PHP
php图片加中文水印实现代码分享
Oct 31 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
thinkPHP模型初始化实例分析
Dec 03 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
Aug 01 PHP
PHP用函数嵌入网站访问量计数器
Oct 27 PHP
PHP常用函数之根据生日计算年龄功能示例
Oct 21 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
PHP5/ZendEngine2的改进
2006/10/09 PHP
用php将任何格式视频转为flv的代码
2009/09/03 PHP
php图片加中文水印实现代码分享
2012/10/31 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
php读取本地json文件的实例
2018/03/07 PHP
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
vue删除html内容的标签样式实例
2018/09/13 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
2018/09/27 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
python提取页面内url列表的方法
2015/05/25 Python
使用TensorFlow实现SVM
2018/09/06 Python
python 同时运行多个程序的实例
2019/01/07 Python
Django实现跨域的2种方法
2019/07/31 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
python中实现词云图的示例
2020/12/19 Python
预备党员思想汇报范文
2014/01/11 职场文书
给学校的建议书
2014/03/12 职场文书
保证书范文大全
2014/04/28 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
大足石刻导游词
2015/02/02 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
初一军训感言
2015/08/01 职场文书