php封装的验证码类分享


Posted in PHP onFebruary 26, 2017

验证码是我们开发的时候经常用到的功能,所以在此本人包装了一个验证码类,应该可以作为php的类插件用,在此分享给各位读友。

实现的原理也是很简单,就是利用画布的几个函数,再加上一些字符串的获取,东凑西凑就构成了,呵呵。

这里大概写一下思路吧,其实这个类已经注释的非常清楚了,不过,个人还是在行文前??乱幌隆?/p>

首先是关于一些函数的解释,这里的解释纯属个人体会,有什么错误的地方,还请读者指正。

1、创建画布函数:imagecreatetruecolor(w,h);

说明:用于创建一个画布。

w 画布的宽

h 画布的高

此函数的返回值资源类(gd)

2、为画布创建一种颜色:imagecolorallocate(img,red,green,blue)

说明:

img画布资源

red,green,blue

是0~255的范围

3、为画布添加背景色

imagefill(img,x,y,color);

说明:

在 image 图像的坐标 x,y(图像左上角为 0, 0)

4、画边框

imagerectangle($img,x1,y1,x2,y2,color);

说明:

其左上角坐标为 x1, y1,右下角坐标为 x2, y2。图像的左上角坐标为 0, 0。

3、绘制内容(字符)

imagestring(img ,size,x,y,string,color);

说明:

img画布

size是字大小 1至5

x,y是起始点

string是所要画的内容

color是颜色

4、告诉浏览器图片格式

header("Content-type:image/png");可为image/gif等等

5、输出(或保存),也可以使用第2个参数实现保存

imagepng(img【,filename】)

imagejpeg(img【,filename】)

imagegif(img【,filename】)

6、添加干扰线,本质就是直线

imageline(img,x1,y1,x2,y2,color);

说明:

img 画布

x1,y1 起点

x2,y2 终点

color 颜色

7、imagettftext ( img,size, angle, x, y, color, fontfile,text )

说明:

img 画布

size 字体大小,缺省单位像素

angle 角度

x,y 坐标点

color 颜色

fontfile 字体文件,必须是中文字体

text 内容

特别说明:这里的color参数都是imagecolorallocate()函数创建的颜色

下面是思路:

这里最先生成画布,之后就是为画布添加字符串,直线,噪点,边框,来生成验证码的,最后类返回的两个公用接口是:可供外面调用的生成验证码的画布和验证码的字符串构成,为的是给外界输出验证码画布,以及存储字符串,作为验证用

下面是代码:

<?php
namespace captcha;
/*
*验证码类
*verify方法生成验证码字符串
*entry方法生成验证码
*特别提醒:这里要先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法调用captchaImage生成的,所以必须先调用它才行
*有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码
*/
class Captcha{
  //配置参数
  private $config = array();
  //验证码
  private $verifyCode = '';
  //获取配置文件的配置信息,给类传参数就行,例如new Captcha($config);$config是你的配置文件信息
  public function __construct($config=array('width'=>100,'height'=>40,'length'=>4,'size'=>7,'lines'=>0,'dots'=>0,'font'=>'simfang.ttf','rectangle'=>array(255,55,122),'charset'=>true,'chinese'=>'来到新机场主航站楼建设在婚姻关系存续期间所负债务她在收到要求她偿还前夫在婚姻关系存续期间所欠债务的法院传票后要精益求精善始善终')){
    $this->config = $config;
  }
  //创建验证码
  private function captchaImage(){
    //画布
    $img = imagecreatetruecolor($this->config['width'],$this->config['height']);
    //填充画布颜色
    imagefill($img,0,0,imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
    //需要边框则画边框
    if($this->config['rectangle'] && is_array($this->config['rectangle']) && count($this->config['rectangle']) == 3){
      $this->tangle($img);
    }
    $this->verifyCode = $this->code($img,$this->config['charset'],$this->config['chinese']);
    //存在则添加干扰线
    if($this->config['lines']){
      $this->codeLines($img);
    }
    //存在则添加干扰点
    if($this->config['dots']){
      $this->codeDots($img);
    }
    return $img;
  }
  private function codeLines($img){
    //绘制干扰线
    for($i=0;$i<$this->config['lines'];$i++){
      imageline($img,mt_rand(0,$this->config['width'] / 10),mt_rand(0,$this->config['height']),mt_rand($this->config['width'] * 7/ 10,$this->config['width'] * 9/ 10),mt_rand(0,$this->config['height']),imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)));
    }
  }
  private function codeDots($img){
    //添加噪点
    for($i=0;$i<$this->config['dots'];$i++){
      //噪点颜色
      $color = imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180));
      imagestring($img,mt_rand(1,3),mt_rand(0,170),mt_rand(0,30),'*',$color);
    
    }
  }
  /*画布边框*/
  private function tangle($img){
    imagerectangle($img,0,0,$this->config['width']-1,$this->config['height']-1,imagecolorallocate($img,$this->config['rectangle'][0],$this->config['rectangle'][1],$this->config['rectangle'][2]));
  }
  /*生成验证码,默认英文,$ch为true则为中文*/
  private function code($img,$ch=false,$set=''){
    $str = "";
    //计算间隔
    $span = ceil($this->config['width']/($this->config['length']+1));
    if($ch && !empty($set)){
      //随机产生字符
      $set = $this->config['chinese'];
      for($i=0;$i<$this->config['length'];$i++){
        $end = strlen($set)/3;
        $pos = mt_rand(0,$end-1);
        $str .= substr($set,$pos*3,3);
      }
      //每次绘制一个字符
      for($i=1;$i<=$this->config['length'];$i++){
        imagettftext($img,16,mt_rand(-30,60),$i*$span,$this->config['height']*3/5,imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)),$this->config['font'],substr($str,($i-1)*3,3));
      }
    }else{
      //随机生成字母或者数字
      for($i=0;$i<$this->config['length'];$i++){
        switch(mt_rand(0,2)){
          case 0:
          $str .= chr(mt_rand(65,90));
          break;
        case 1:
          $str .= chr(mt_rand(97,122));
          break;
        case 2:
          $str .= chr(mt_rand(48,57));
        }
      }
      //每次绘制一个字符
      for($i=1;$i<=$this->config['length'];$i++){
        imagestring($img,$this->config['size'],$i*$span,0,$str[$i-1],imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)));
      }
    }
    return $str;
  }
  //获取验证码
  public function verify(){
    return $this->verifyCode;
  }
  //生成验证码
  public function entry(){
    header("content-type:image/png");
    imagepng($this->captchaImage());
  }
}
$ob = new Captcha;
$ob->entry();

最后,为了不误人子弟,还是再强调一遍:
这里必须先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法的方法captchaImage中生成的,所以必须先调用它才行 有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码

PHP 相关文章推荐
php xml 入门学习资料
Jan 01 PHP
php连接数据库代码应用分析
May 29 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
May 07 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
php中session退出登陆问题
Feb 27 PHP
php使用mkdir创建多级目录入门例子
May 10 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
May 06 PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 PHP
PHP7内核之Reference详解
Mar 14 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
Apr 02 PHP
Laravel框架查询构造器简单示例
May 08 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
Feb 25 #PHP
简单谈谈PHP中的trait
Feb 25 #PHP
laravel中命名路由的使用方法
Feb 24 #PHP
cakephp常见知识点汇总
Feb 24 #PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
Feb 24 #PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 #PHP
CakePHP框架Session设置方法分析
Feb 23 #PHP
You might like
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
JavaScript 指导方针
2007/04/05 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
js简单抽奖代码
2015/01/16 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
JS重载实现方法分析
2016/12/16 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
详谈python http长连接客户端
2017/06/12 Python
Python流程控制 if else实现解析
2019/09/02 Python
python中setuptools的作用是什么
2020/06/19 Python
python中random模块详解
2021/03/01 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
品恩科技软件测试面试题
2014/10/26 面试题
校园公益广告语
2014/03/13 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
社区党建工作总结2015
2015/05/13 职场文书
党小组评议意见
2015/06/02 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python
利用Apache Common将java对象池化的问题
2022/06/16 Servers