php封装的验证码工具类完整实例


Posted in PHP onOctober 19, 2016

本文实例讲述了php封装的验证码工具类。分享给大家供大家参考,具体如下:

<?php
//验证码工具类
class Captcha{
    //属性
    private $width;
    private $height;
    private $fontsize;
    private $pixes;
    private $lines;
    private $str_len;
    /*
     * 构造方法
     * @param1 array $arr = array(),初始化属性的关联数组
    */
    public function __construct($arr = array()){
      //初始化
      $this->width = isset($arr['width']) ? $arr['width'] : $GLOBALS['config']['captcha']['width'];
      $this->height = isset($arr['height']) ? $arr['height'] : $GLOBALS['config']['captcha']['height'];
      $this->fontsize = isset($arr['fontsize']) ? $arr['fontsize'] : $GLOBALS['config']['captcha']['fontsize'];
      $this->pixes = isset($arr['pixes']) ? $arr['pixes'] : $GLOBALS['config']['captcha']['pixes'];
      $this->lines = isset($arr['lines']) ? $arr['lines'] : $GLOBALS['config']['captcha']['lines'];
      $this->str_len = isset($arr['str_len']) ? $arr['str_len'] : $GLOBALS['config']['captcha']['str_len'];
    }
    /*
     * 产生验证码图片
    */
    public function generate(){
      //制作画布
      $img = imagecreatetruecolor($this->width,$this->height);
      //给定背景色
      $bg_color = imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
      imagefill($img,0,0,$bg_color);
      //制作干扰线
      $this->getLines($img);
      //增加干扰点
      $this->getPixels($img);
      //增加验证码文字
      $captcha = $this->getCaptcha();
      //文字颜色
      $str_color = imagecolorallocate($img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
      //写入文字
      //计算文字应该出现的起始位置
      $start_x = ceil($this->width/2) - 25;
      $start_y = ceil($this->height/2) - 8;
      if(imagestring($img,$this->fontsize,$start_x,$start_y,$captcha,$str_color)){
        //成功:输出验证码
        header('Content-type:image/png');
        imagepng($img);
      }else{
        //失败
        return false;
      }
    }
    /*
     * 获取验证码随机字符串
     * @return string $captcha,随机验证码文字
    */
    private function getCaptcha(){
      //获取随机字符串
      $str = implode('',array_merge(range('a','z'),range('A','Z'),range(1,9)));
      //随机取
      $captcha = '';  //保存随机字符串
      for($i = 0,$len = strlen($str);$i < $this->str_len;$i++){
        //每次随机取一个字符
        $captcha .= $str[mt_rand(0,$len - 1)] . ' ';
      }
      //将数据保存到session
      $_SESSION['captcha'] = str_replace(' ','',$captcha);
      //返回值
      return $captcha;
    }
    /*
     * 增加干扰点
     * @param1 resource $img
    */
    private function getPixels($img){
      //增加干扰点
      for($i = 0;$i < $this->pixes;$i++){
        //分配颜色
        $pixel_color = imagecolorallocate($img,mt_rand(100,150),mt_rand(100,150),mt_rand(100,150));
        //画点
        imagesetpixel($img,mt_rand(0,$this->width),mt_rand(0,$this->height),$pixel_color);
      }
    }
    /*
     * 增加干扰线
     * @param1 resource $img,要增加干扰线的图片资源
    */
    private function getLines($img){
      //增加干扰线
      for($i = 0;$i < $this->lines;$i++){
        //分配颜色
        $line_color = imagecolorallocate($img,mt_rand(150,200),mt_rand(150,200),mt_rand(150,200));
        //画线
        imageline($img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$line_color);
      }
    }
    /*
     * 验证验证码
     * @param1 string $captcha,用户提交的验证码
     * @return bool,成功返回true,失败返回false
    */
    public static function checkCaptcha($captcha){
      //验证码不区分大小写
      return (strtolower($captcha) === strtolower($_SESSION['captcha']));
    }
}

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

PHP 相关文章推荐
php db类库进行数据库操作
Mar 19 PHP
php接口与接口引用的深入解析
Aug 09 PHP
php获取从百度搜索进入网站的关键词的详细代码
Jan 08 PHP
php+xml实现在线英文词典查询的方法
Jan 23 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
Jun 19 PHP
Yii使用技巧大汇总
Dec 29 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
php中的explode()函数实例介绍
Jan 18 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 PHP
laravel 使用事件系统统计浏览量的实现
Oct 16 PHP
php封装的图片(缩略图)处理类完整实例
Oct 19 #PHP
php封装的表单验证类完整实例
Oct 19 #PHP
php魔术方法功能与用法实例分析
Oct 19 #PHP
php封装的smartyBC类完整实例
Oct 19 #PHP
php封装的smarty类完整实例
Oct 19 #PHP
PHP内存缓存功能memcached示例
Oct 19 #PHP
PHP实现上传图片到 zimg 服务器
Oct 19 #PHP
You might like
用PHP实现登陆验证码(类似条行码状)
2006/10/09 PHP
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
PHP echo()函数讲解
2019/02/15 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
pyside写ui界面入门示例
2014/01/22 Python
Python实现在线程里运行scrapy的方法
2015/04/07 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
详解python编译器和解释器的区别
2019/06/24 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
项目副经理岗位职责
2013/12/30 职场文书
解放思想大讨论活动心得体会
2014/09/11 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python
python神经网络 使用Keras构建RNN训练
2022/05/04 Python