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 相关文章推荐
一个ftp类(ini.php)
Oct 09 PHP
关于文本留言本的分页代码
Oct 09 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
使用GD库生成带阴影文字的图片
Mar 27 PHP
如何解决PHP无法实现多线程的问题
Sep 25 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
PHP简单日历实现方法
Jul 20 PHP
老生常谈PHP位运算的用途
Mar 12 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 PHP
PHP7 新增功能
Mar 09 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的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
限制复选框的最大可选数
2006/07/01 Javascript
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
Python实现统计代码行的方法分析
2017/07/12 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
关于Python作用域自学总结
2019/06/10 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
零件设计自荐信范文
2013/11/27 职场文书
中专毕业生的自我鉴定
2013/12/01 职场文书
采购部部长岗位职责
2014/02/06 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
房产委托公证书样本
2014/04/04 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
保密工作整改报告
2014/11/06 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
董事长助理岗位职责
2015/02/11 职场文书
2019大学生实习报告
2019/06/21 职场文书
PyTorch device与cuda.device用法
2022/04/03 Python
idea下配置tomcat避坑详解
2022/04/12 Servers