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输出缓存(output_buffering)的深入理解
Jun 13 PHP
Chrome Web App开发小结
Sep 04 PHP
php的mssql数据库连接类实例
Nov 28 PHP
php实现检查文章是否被百度收录
Jan 27 PHP
Linux下编译redis和phpredis的方法
Apr 07 PHP
php生成与读取excel文件
Oct 14 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 PHP
PHP实现随机发扑克牌
Apr 22 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 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在DOS命令行下却无法链接MySQL的技术笔记
2010/12/29 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
python负载均衡的简单实现方法
2018/02/04 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
python简单区块链模拟详解
2019/07/03 Python
Python list与NumPy array 区分详解
2019/11/06 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
python处理写入数据代码讲解
2020/10/22 Python
Python基于execjs运行js过程解析
2020/11/27 Python
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
写自荐信有哪些不宜?
2013/10/17 职场文书
师德师风整改措施
2014/10/24 职场文书
采购员工作总结范文
2015/08/12 职场文书