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 相关文章推荐
apache+mysql+php+ssl服务器之完全安装攻略
Sep 05 PHP
Windows下的PHP5.0详解
Nov 18 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
discuz的php防止sql注入函数
Jan 17 PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 PHP
php实现多城市切换特效
Aug 09 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
Oct 16 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
Feb 01 PHP
php简单实现sql防注入的方法
Apr 22 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
详解PHP设计模式之依赖注入模式
May 25 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
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
html读出文本文件内容
2007/01/22 Javascript
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
jQuery ready函数滥用分析
2011/02/16 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
JavaScript中的比较操作符&gt;、=、
2014/12/31 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
vue中$nextTick的用法讲解
2019/01/17 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
亲自动手实现vue日历控件
2019/06/26 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
名片管理系统python版
2018/01/11 Python
PyQt5实现拖放功能
2018/04/25 Python
python生成器与迭代器详解
2019/01/01 Python
python同时替换多个字符串方法示例
2019/09/17 Python
tensorflow 变长序列存储实例
2020/01/20 Python
NumPy统计函数的实现方法
2020/01/21 Python
匡威西班牙官网:Converse西班牙
2019/10/01 全球购物
进口业务员岗位职责
2014/04/06 职场文书
商场客服专员岗位职责
2014/06/13 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
地球一小时活动总结
2015/02/27 职场文书
python实现剪贴板的操作
2021/07/01 Python
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers