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 获取远程文件内容的函数代码
Mar 24 PHP
PHP mcrypt可逆加密算法分析
Jul 19 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
php汉字转拼音的示例
Feb 27 PHP
分享一个php 的异常处理程序
Jun 22 PHP
thinkphp实现like模糊查询实例
Oct 29 PHP
php函数serialize()与unserialize()用法实例
Nov 06 PHP
隐性调用php程序的方法
Jun 13 PHP
详解PHP匿名函数与注意事项
Mar 29 PHP
利用php输出不同的心形图案
Apr 22 PHP
Yii2增加验证码步骤详解
Apr 25 PHP
PHP连接及操作PostgreSQL数据库的方法详解
Jan 30 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 多进程 解决难题
2009/06/22 PHP
php_xmlhttp 乱码问题解决方法
2009/08/07 PHP
Views rows style模板重写代码
2011/05/16 PHP
php array_walk() 数组函数
2011/07/12 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
js字符串类型String常用操作实例总结
2019/07/05 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
python字符串连接方式汇总
2014/08/21 Python
Python下Fabric的简单部署方法
2015/07/14 Python
对于Python中RawString的理解介绍
2016/07/07 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
快速了解python leveldb
2018/01/18 Python
python中map的基本用法示例
2018/09/10 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
python装饰器的特性原理详解
2019/12/25 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
数学教学随笔感言
2014/02/17 职场文书
爱我中华教学反思
2014/04/28 职场文书
节约能源标语
2014/06/17 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
合理化建议书范文
2015/09/14 职场文书
如何写好闭幕词
2019/04/02 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
nginx共享内存的机制详解
2022/03/21 Servers