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下使用SimpleXML 处理XML 文件
Feb 27 PHP
PHP正则表达式之定界符和原子介绍
Oct 05 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
php根据操作系统转换文件名大小写的方法
Feb 24 PHP
Yii框架中memcache用法实例
Dec 03 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
Mar 27 PHP
从刷票了解获得客户端IP的方法
Sep 21 PHP
php用户注册信息验证正则表达式
Nov 12 PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 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
PHP 和 HTML
2006/10/09 PHP
杏林同学录(八)
2006/10/09 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
php中JSON的使用与转换
2015/01/14 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
javascript中的float运算精度实例分析
2010/08/21 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
微信小程序仿通讯录功能
2020/04/09 Javascript
python基础教程之自定义函数介绍
2014/08/29 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
Python生成器generator用法示例
2018/08/10 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
python3中for循环踩过的坑记录
2020/12/14 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
python 批量将中文名转换为拼音
2021/02/07 Python
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
护理专业推荐信
2013/11/07 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
建房协议书
2014/04/11 职场文书
2014年收银工作总结
2014/11/13 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js