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 date与gmdate的获取日期的区别
Feb 08 PHP
php &amp;&amp; 逻辑与运算符使用说明
Mar 04 PHP
php学习之 数组声明
Jun 09 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
Jul 10 PHP
php.ini 配置文件的深入解析
Jun 17 PHP
解析centos中Apache、php、mysql 默认安装路径
Jun 25 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
Oct 17 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
php慢查询日志和错误日志使用详解
Feb 27 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
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
php防止SQL注入详解及防范
2013/11/12 PHP
PHP浮点数精度问题汇总
2015/05/13 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
2016/05/17 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
2017/04/04 PHP
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
python getopt 参数处理小示例
2009/06/09 Python
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
python tornado使用流生成图片的例子
2019/11/18 Python
python字典与json转换的方法总结
2020/12/28 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
高级方案规划工程师岗位职责
2013/11/29 职场文书
给老师的道歉信
2014/01/11 职场文书
2014年节能工作总结
2014/12/18 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android