PHP实现的封装验证码类详解


Posted in PHP onJune 18, 2013

用PHP写一个验证码类,并进行封装。
类名: validationcode.class.php
代码如下:

<?php
 class ValidationCode {
  private $width;
  private $height;
  private $codeNum;
  private $image;   //图像资源
  private $disturbColorNum;
  private $checkCode;
  function __construct($width=80, $height=20, $codeNum=4){
   $this->width=$width;
   $this->height=$height;
   $this->codeNum=$codeNum;
   $this->checkCode=$this->createCheckCode();
   $number=floor($width*$height/15);   if($number > 240-$codeNum){
    $this->disturbColorNum= 240-$codeNum;
   }else{
    $this->disturbColorNum=$number;
   }
  }
  //通过访问该方法向浏览器中输出图像
  function showImage($fontFace=""){
   //第一步:创建图像背景
   $this->createImage();
   //第二步:设置干扰元素
   $this->setDisturbColor();
   //第三步:向图像中随机画出文本
   $this->outputText($fontFace);
   //第四步:输出图像
   $this->outputImage();
  }
  //通过调用该方法获取随机创建的验证码字符串
  function getCheckCode(){
   return $this->checkCode;
  }
  private function createImage(){
   //创建图像资源
   $this->image=imagecreatetruecolor($this->width, $this->height);
   //随机背景色
   $backColor=imagecolorallocate($this->image, rand(225, 255), rand(225,255), rand(225, 255));
   //为背景添充颜色
   imagefill($this->image, 0, 0, $backColor);
   //设置边框颜色
   $border=imagecolorallocate($this->image, 0, 0, 0);
   //画出矩形边框
   imagerectangle($this->image, 0, 0, $this->width-1, $this->height-1, $border);
  }
  private function  setDisturbColor(){
   for($i=0; $i<$this->disturbColorNum; $i++){
    $color=imagecolorallocate($this->image, rand(0, 255), rand(0, 255), rand(0, 255));
    imagesetpixel($this->image, rand(1, $this->width-2), rand(1, $this->height-2), $color);
   }
   for($i=0; $i<10; $i++){
    $color=imagecolorallocate($this->image, rand(200, 255), rand(200, 255), rand(200, 255));
    imagearc($this->image, rand(-10, $this->width), rand(-10, $this->height), rand(30, 300), rand(20, 200), 55, 44, $color);
   }
  }
  private function createCheckCode(){
//这里主要产生随机码,从2开始是为了区分1和l
   $code="23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ";
   $string='';
   for($i=0; $i < $this->codeNum; $i++){
    $char=$code{rand(0, strlen($code)-1)};
    $string.=$char;
   }
   return $string;
  }
  private function outputText($fontFace=""){
   for($i=0; $i<$this->codeNum; $i++){
    $fontcolor=imagecolorallocate($this->image, rand(0, 128), rand(0, 128), rand(0, 128));
    if($fontFace==""){
     $fontsize=rand(3, 5);
     $x=floor($this->width/$this->codeNum)*$i+3;
     $y=rand(0, $this->height-15);
     imagechar($this->image,$fontsize, $x, $y, $this->checkCode{$i},$fontcolor);
    }else{
     $fontsize=rand(12, 16);
     $x=floor(($this->width-8)/$this->codeNum)*$i+8;
     $y=rand($fontSize+5, $this->height);
     imagettftext($this->image,$fontsize,rand(-30, 30),$x,$y ,$fontcolor, $fontFace, $this->checkCode{$i});
    }
   }
  }
  private function outputImage() {
   if(imagetypes() & IMG_GIF){
    header("Content-Type:image/gif");
    imagepng($this->image);
   }else if(imagetypes() & IMG_JPG){
    header("Content-Type:image/jpeg");
    imagepng($this->image);
   }else if(imagetypes() & IMG_PNG){
    header("Content-Type:image/png");
    imagepng($this->image);
   }else if(imagetypes() & IMG_WBMP){
    header("Content-Type:image/vnd.wap.wbmp");
    imagepng($this->image);
   }else{
    die("PHP不支持图像创建");
   }
  }
  function __destruct(){
   imagedestroy($this->image);
  }
 }

使用如下:
测试,调用验证码类
code.php
<?php
session_start();
include "validationcode.class.php";
$code=new ValidationCode(80, 20, 4);
$code->showImage();   //输出到页面中供 注册或登录使用
$_SESSION["code"]=$code->getCheckCode();  //将验证码保存到服务器中

PHP 相关文章推荐
用php和MySql来与ODBC数据连接
Oct 09 PHP
浅析PHP水印技术
Feb 14 PHP
.htaccess文件保护实例讲解
Feb 06 PHP
PHPThumb图片处理实例
May 03 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
ThinkPHP模板自定义标签使用方法
Jun 26 PHP
php断点续传之文件分割合并详解
Dec 13 PHP
thinkPHP5.0框架模块设计详解
Mar 18 PHP
完美解决在ThinkPHP控制器中命名空间的问题
May 05 PHP
PHP实现小程序批量通知推送
Nov 27 PHP
php封装的pdo数据库操作工具类与用法示例
May 08 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 PHP
php empty()与isset()区别的详细介绍
Jun 17 #PHP
php include和require的区别深入解析
Jun 17 #PHP
浅析php header 跳转
Jun 17 #PHP
解析php中heredoc的使用方法
Jun 17 #PHP
深入PHP5中的魔术方法详解
Jun 17 #PHP
php.ini 配置文件的深入解析
Jun 17 #PHP
解析posix与perl标准的正则表达式区别
Jun 17 #PHP
You might like
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
PHP发送短信代码分享
2015/08/11 PHP
PHP打印输出函数汇总
2016/08/28 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
jquery中trigger()无法触发hover事件的解决方法
2015/05/07 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
详解Python中for循环的使用
2015/04/14 Python
Django的数据模型访问多对多键值的方法
2015/07/21 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
导致python中import错误的原因是什么
2020/07/01 Python
面向对象编程OOP的优点
2013/01/22 面试题
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
神农溪导游词
2015/02/11 职场文书
税务会计岗位职责
2015/04/02 职场文书
小学教师岗位职责
2015/04/02 职场文书
Python使用Kubernetes API访问集群
2021/05/30 Python
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python