验证码是众多网站登陆、注册等相关功能不可以或缺的功能,实现展示验证码的方式有很多,这篇文章作者以工作中比较常用的方法进行了封装。

逻辑准备

要实现一个完整的验证码,需要包含以下属性和功能

验证码类
{
属性:
宽度
高度
干扰点
验证码(私有的)
验证码字符的个数
验证码的类型(纯数字类型、纯字母类型、混合类型) 图片类型(jpg、png、bmp……)
图片资源 功能:
构造函数(用来初始化)
生成验证码的函数 创建画布
填充背景色
填充干扰点
填充干扰弧线
画验证码
输出图片
}

根据上面的逻辑,接下来我们就一步步将文字描述转换为代码

//创建一个名为Verify的验证码类
class Verify
{
/*
定义验证码属性
*/
//图片的宽度
public $width;
//图片的高度
public $height;
//私有化验证码字符串,避免生成后被修改
private $verifyCode;
//存储验证码字符的个数
public $verifyNums;
//存储验证码的字符类型 1->纯数字 2->纯字母 3->混合类
public $verifyType;
//背景颜色
public $bgColor;
//文字颜色
public $fontColor;
//验证码的图片类型jpg,png,bmp……
public $imgType; //图片资源
private $res; /*
功能
*/
//功能函数,初始化一些可以被初始化的参数
public function __construct($width = 100,$height = 50,$imgType = 'jpg',$verifyNums = 4,$verifyType = 1)
{
$this->width = $width;
$this->height = $height;
$this->imgType = $imgType;
$this->verifyNums = $verifyNums;
$this->verifyType = $verifyType; //初始化一个可以随机生成验证码的函数,将生成的验证码春初到verifyCode属性里
$this->verifyCode = $this->createVerifyCode();
} //随机生成验证码的函数,因为不对外公布,设置为私有的
private function createVerifyCode()
{
//通过判断验证的类型来确定生成哪一种验证码
//verifyType=1生成纯数字,为2生成纯字母,为3生成混合
switch ($this->verifyType) {
case 1:
/*生成纯数字,首先使用range(0,9)生成数组
*通过$this->verifyNums确定字符串的个数
*使用array_rand()从数组中随机获取相应个数
*使用join将数字拼接成字符串,存储到$str中
*/
$str = join('',array_rand(range(0,9),$this->verifyNums));
break;
case 2:
/*生成纯字母,
*小写字母数组range('a','z')
*大写字母数组range('A','Z')
*合并两个数组array_merge()
*更换键和值 array_filp()
*随机获取数组中的特定个数的元素 array_rand()
*拼接成字符串 implode()
*/
$str = implode(array_rand(array_filp(array_merge(range('a','z'),range('A','Z'))),$this->verifyNums));
break;
case 3:
//混合类型
$words = str_shuffle('abcdefghjkmpopqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY3456789');
$str = substr($words,0,this->verifyNums);
break;
}
return $str;
} //开始准备生成图片
/*方法名:show()
*功能 :调用生成图片的所有方法
*/
public function show()
{
$this->createImg();//创建图片资源
$this->fillBg(); //填充背景颜色
$this->fillPix(); //填充干扰点
$this->fillArc(); //填充干扰弧线
$this->writeFont();//写字
$this->outPutImg();//输出图片
} //创建图片资源:imagecreatetruecolor($width,$height)
private function createImg()
{
$this->res = imagecreatetruecolor($this->width,$this->height);
} //填充背景颜色:imagefill($res,$x,$y,$color)
//随机生成深色--->imagecolorallocate($res,$r,$g,$b)
private function setDarkColor()
{
return imagecolorallocate($this->res,mt_rand(130,255),mt_rand(130,255),mt_rand(130,255));
}
//随机生成浅色
private function setLightColor()
{
return imagecolorallocate($this->res,mt_rand(0,130),mt_rand(0,130),mt_rand(0,130));
}
//开始填充
private function fillBg
{
imagefill($this->res,0,0$this->setDarkColor());
} //随机生成干扰点-->imagesetpixel
private function fillPix()
{
//计算产生多少个干扰点,这里设置每20个像素产生一个
$num = ceil(($this->width * $this->height) / 20);
for($i = 0; $i < $num; $i++){
imagesetpixel($this->res,mt_rand(0,$this->width),mt_rand(0,$this->height),$this->setDarkColor());
}
} //随机画10条弧线->imagearc()
private function fillArc()
{
for($i = 0;$i < 10;$i++){
imagearc($this->res,
mt_rand(10,$this->width-10),
mt_rand(5,$this->height-5),
mt_rand(0,$this->width),
mt_rand(0,$this->height),
mt_rand(0,180),
mt_rand(181,360),
$this->setDarkColor());
}
} /*在画布上写文字
*根据字符的个数,将画布横向分成相应的块
$every = ceil($this->width/$this->verifyNums);
*每一个小块的随机位置画上对应的字符
imagechar();
*/ private function writeFont()
{
$every = ceil($this->width / $this->verifyNums);
for($i = 0;$i < $this->verifyNums;$i++){
$x = mt_rand(($every * $i) + 5,$every * ($i + 1) - 5);
$y = mt_rand(5,$this->height - 10); imagechar($this->res,6,$x,$y,$this->verifyCode[$i],$this->setLightColor());
}
} //输出图片资源
private function outPutImg()
{
//header('Content-type:image/图片类型')
header('Content-type:image/'.$this->imgType); //根据图片类型,调用不同的方法输出图片
//imagepng($img)/imagejpg($img)
$func = 'image'.$this->imgType;
$func($this->res);
} //设置验证码字符只能调用,不能修改,用来验证验证码书否输入正确
public function __get($name){
if($name = 'verifyCode'){
return $this->verifyCode;
}
} //析构方法,自动销毁图片资源
public function __destruct()
{
imagedestroy($this->res);
}
}

致此,验证码函数类已经全部完成,调用方法如下

// Verify(宽,高,类型,个数,类型)
// 数字类型
$verify = new Verify(100,40,'png',4,1);
//生成
$verify->show();

//字母类型
$verify = new Verify(100,40,'png',4,2);
$verify->show();

//混合类型
$verify = new Verify(100,40,'png',4,3);
$verify->show();

类中的关于创建画布的函数不明白的自行查询PHP手册

关于匹配验证码,通过$this->verifyCode获取到字符串的值,进而进行比较


欢迎关注微信公众号:zhyunfe-com,共同交流

php面向对象(OOP)---- 验证码类的更多相关文章

  1. PHP面向对象(OOP)----分页类

    > 同验证码类,分页也是在个人博客,论坛等网站中不可缺少的方式,通过分页可以在一个界面展示固定条数的数据,而不至于将所有数据全部罗列到一起,实现分页的原理其实就是对数据库查询输出加了一个limi ...

  2. PHP面向对象简易验证码类

    PHP简易验证码类 <?php class authCode { private static $instance = null; #实例对象 private $width = 120; #图片 ...

  3. 面向对象oop 和类

    面向对象与面向过程的区别 面向对象:面向对象的思维模式说白了就是分类思维模式.思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考.最后,才对某个分类下的细节进行面向过程的思索 自我理解(领 ...

  4. PHP 简单面向对象 验证码类(静态实例对象调用)

    没事写了一个简单的面向对象验证码类,可以直接使用(替换一下字体路径) <?php class authCode { private static $instance = null; #实例对象 ...

  5. PHP面向对象(OOP)编程入门教程

    面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...

  6. 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?

    面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...

  7. php面向对象(OOP)编程完全教程

    摘自:http://www.php-note.com/article/detail/41 面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行P ...

  8. PHP验证码类

    通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中.只要在创建对象时,为构造方法提供三个参数 ...

  9. 一个经典的PHP验证码类分享

    我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现 的细节封装在该类中.只要在创建对象时,为构造方法提供三 ...

随机推荐

  1. Ubuntu和win10双系统Grup无法引导解决方案

    通常我们经常安装双系统, 但是有时候安装完系统无法正常引导, 以下就说明Ubuntu和win10双系统, win10在grub界面不断循环的解决方案 直接在win10启动项目上按e进入编辑模式 在文档 ...

  2. (简单) POJ 1860 Currency Exchange,SPFA判圈。

    Description Several currency exchange points are working in our city. Let us suppose that each point ...

  3. (中等) HDU 1043 Eight,经典搜索问题。

    Problem Description The 15-puzzle has been around for over 100 years; even if you don't know it by t ...

  4. OSX下编译安装opencv3.1.0与opencv_contrib_master

    OSX版本10.11.3 1.安装homebrew,打开终端,写入指令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Hom ...

  5. iOS9新特性-3D Touch

    本文主要讲解3DTouch各种场景下的开发方法,开发主屏幕应用icon上的快捷选项标签(Home Screen Quick Actions),静态设置 UIApplicationShortcutIte ...

  6. 修改maven本地仓库的位置

  7. js函数——setinterval和setTimeout

    1.window.setTimeout方法 该方法可以延时执行一个函数,例如: <script language="JavaScript" type="text/j ...

  8. Crazyflie笔记五: CRTP 实时通信协议(一)(转)

    源:Crazyflie笔记五: CRTP 实时通信协议(一) 这里详细介绍了 Crazyflie 的 CRTP实时通信协议的相关内容,由于内容很长,分几篇博文来讲述.这里是第一节内容.欢迎交流:301 ...

  9. Run Loop简介

    做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出 ...

  10. struts2拦截器-自定义拦截器,放行某些方法(web.xml配置)

    一.web.xml配置 <filter> <filter-name>encodingFilter</filter-name> <filter-class> ...