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 相关文章推荐
一个简单实现多条件查询的例子
Oct 09 PHP
探讨php中防止SQL注入最好的方法是什么
Jun 10 PHP
smarty基础之拼接字符串的详解
Jun 18 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 PHP
thinkPHP3.2.2框架行为扩展及demo示例
Jun 19 PHP
php中array_fill函数的实例用法
Mar 02 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中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
Python函数学习笔记
2008/10/07 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
Python面向对象进阶学习
2019/05/21 Python
浅析python内置模块collections
2019/11/15 Python
python如何随机生成高强度密码
2020/08/19 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
Python中生成ndarray实例讲解
2021/02/22 Python
财务出纳员岗位职责
2013/11/26 职场文书
金属材料工程个人求职的自我评价
2013/12/04 职场文书
安全生产先进个人材料
2014/02/06 职场文书
向领导表决心的话
2014/03/11 职场文书
毕业生找工作求职信
2014/08/05 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
领导新年致辞2016
2015/07/29 职场文书
关于空气污染危害的感想
2015/08/11 职场文书