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 相关文章推荐
建立文件交换功能的脚本(二)
Oct 09 PHP
ADODB类使用
Nov 25 PHP
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
Aug 19 PHP
用php获取远程图片并把它保存到本地的代码
Apr 07 PHP
php 动态执行带有参数的类方法
Apr 10 PHP
php根据日期判断星座的函数分享
Feb 13 PHP
PHP代码优化的53个细节
Mar 03 PHP
php将字符串转换成16进制的方法
Mar 17 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
laravel框架 laravel-admin上传图片到oss的方法
Oct 13 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
May 15 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
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
javaScript parseInt字符转化为数字函数使用小结
2009/11/05 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
js实现指定时间倒计时效果
2019/08/26 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
Python SQLite3数据库操作类分享
2014/06/10 Python
Python实现方便使用的级联进度信息实例
2015/05/05 Python
在python 中实现运行多条shell命令
2019/01/07 Python
python实现AES加密解密
2019/03/28 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
函授毕业生的自我鉴定
2013/11/26 职场文书
护士实习生自我鉴定范文
2013/12/10 职场文书
合作意向书范本
2014/03/31 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
个人简历自荐信
2014/06/26 职场文书
单位授权委托书范文
2014/08/02 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
通知书大全
2015/04/27 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
2019军训心得体会
2019/06/27 职场文书
分析Java中Map的遍历性能问题
2021/06/26 Java/Android