php封装的验证码类分享
发布时间 - 2026-01-10 23:17:14 点击率:次验证码是我们开发的时候经常用到的功能,所以在此本人包装了一个验证码类,应该可以作为php的类插件用,在此分享给各位读友。

实现的原理也是很简单,就是利用画布的几个函数,再加上一些字符串的获取,东凑西凑就构成了,呵呵。
这里大概写一下思路吧,其实这个类已经注释的非常清楚了,不过,个人还是在行文前啰嗦一下。
首先是关于一些函数的解释,这里的解释纯属个人体会,有什么错误的地方,还请读者指正。
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
# 验证码
# php验证码类
# php封装验证码
# 一个漂亮的php验证码类(分享)
# PHP验证码类代码( 最新修改
# 完全定制化! )
# 一个经典的PHP验证码类分享
# 一个好用的PHP验证码类实例分享
# PHP 动态随机生成验证码类代码
# 一个PHP验证码类代码分享(已封装成类)
# PHP学习笔记 用户注册模块用户类以及验证码类
# php实现的Captcha验证码类实例
# 必须先
# 是在
# 在此
# 较高
# 噪点
# 不支持
# 才行
# 再用
# 才能够
# 配置文件
# 都是
# 婚姻关系
# 有什么
# 几个
# 善始善终
# 一遍
# 再加上
# 就行
# 英文
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
韩国服务器如何优化跨境访问实现高效连接?
如何在阿里云部署织梦网站?
如何制作一个表白网站视频,关于勇敢表白的小标题?
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
Laravel如何生成URL和重定向?(路由助手函数)
Laravel怎么上传文件_Laravel图片上传及存储配置
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
网站制作壁纸教程视频,电脑壁纸网站?
如何在宝塔面板中修改默认建站目录?
黑客如何利用漏洞与弱口令入侵网站服务器?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Java遍历集合的三种方式
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
佛山企业网站制作公司有哪些,沟通100网上服务官网?
php结合redis实现高并发下的抢购、秒杀功能的实例
如何破解联通资金短缺导致的基站建设难题?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
微信小程序 配置文件详细介绍
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
使用C语言编写圣诞表白程序
Laravel如何使用Telescope进行调试?(安装和使用教程)
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Laravel如何实现用户密码重置功能?(完整流程代码)
深圳网站制作平台,深圳市做网站好的公司有哪些?
如何快速查询域名建站关键信息?
微信h5制作网站有哪些,免费微信H5页面制作工具?
JavaScript如何实现路由_前端路由原理是什么
如何快速搭建自助建站会员专属系统?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
如何用AWS免费套餐快速搭建高效网站?
如何确保FTP站点访问权限与数据传输安全?
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
大连网站制作公司哪家好一点,大连买房网站哪个好?
什么是javascript作用域_全局和局部作用域有什么区别?
html如何与html链接_实现多个HTML页面互相链接【互相】
如何在万网利用已有域名快速建站?
bing浏览器学术搜索入口_bing学术文献检索地址
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Linux系统运维自动化项目教程_Ansible批量管理实战
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
js实现获取鼠标当前的位置
Android okhttputils现在进度显示实例代码
如何在局域网内绑定自建网站域名?
Laravel怎么清理缓存_Laravel optimize clear命令详解
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧

