PHP code 验证码生成类定义和简单使用示例


Posted in PHP onMay 27, 2020

本文实例讲述了PHP code 验证码生成类定义和简单使用。分享给大家供大家参考,具体如下:

code.php

<?php
namespace code;
/**
 * Class Code
 */
class Code
{
  protected $number;//验证码内字符个数
  protected $codeType;//验证码样式
  protected $width;//图像宽
  protected $height;//图像高
  protected $code;//验证码
  protected $image;//图像资源
 
  /**
   * Code constructor.
   * @param int $number
   * @param int $codeType
   * @param int $width
   * @param int $height
   */
  public function __construct($number=5, $codeType=2, $width=100, $height=40)
  {
    $this->number = $number;
    $this->codeType = $codeType;
    $this->width = $width;
    $this->height = $height;
    $this->code = $this->createCode();
  }
 
  /**
   * 销毁资源
   */
  public function __destruct()
  {
    imagedestroy($this->image);
  }
 
  /**
   * 外部调用code时触发
   * @param $name
   * @return bool
   */
  public function __get($name)
  {
    if ('code' == $name) {
      return $this->$name;
    } else {
      return false;
    }
  }
 
  /**
   * 生成code
   */
  protected function createCode()
  {
    switch ($this->codeType) {
      case 0:
        $code = $this->getNum();
        break;
      case 1:
        $code = $this->getChar();
        break;
      case 2:
        $code = $this->getNumChar();
        break;
      default:
        die('样式不对');
    }
    return $code;
  }
 
  /**
   * 数字验证码
   * @return string
   */
  protected function getNum()
  {
    $str = join('', range(0,9));
    return substr(str_shuffle($str), 0, $this->number);
  }
 
  /**
   * 字符验证码
   * @return string
   */
  protected function getChar()
  {
    $str = join('', range('a', 'z'));
    $str = $str . strtoupper($str);
    return substr(str_shuffle($str), 0, $this->number);
  }
 
  /**
   * 字符和数字混合验证码
   * @return string
   */
  protected function getNumChar()
  {
    $num = join('', range(0, 9));
    $str = join('', range('a', 'z'));
    $str_big = strtoupper($str);
    $numChar = $num . $str . $str_big;
    return substr(str_shuffle($numChar), 0, $this->number);
  }
 
  /**
   * 生成图像
   */
  protected function createImage()
  {
    $this->image = imagecreatetruecolor($this->width, $this->height);
  }
 
  /**
   * 填充背景色
   */
  protected function fillColor()
  {
    imagefill($this->image, 0, 0, $this->lightColor());
  }
 
  /**
   * 浅颜色
   * @return int
   */
  protected function lightColor()
  {
    return imagecolorallocate($this->image, mt_rand(170, 255), mt_rand(170, 255), mt_rand(170, 255));
  }
 
  /**
   * 深颜色
   * @return int
   */
  protected function darkColor()
  {
    return imagecolorallocate($this->image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
  }
 
  /**
   * 添加验证码字符
   */
  protected function drawChar()
  {
    $width = ceil($this->width/$this->number);
    for ($i = 0; $i < $this->number; $i++) {
      $x = mt_rand($i * ($width - 5), ($i + 1) * ($width - 5));
      $y = mt_rand(0, $this->height - 15);
      imagechar($this->image, 5, $x, $y, $this->code[$i], $this->darkColor());
    }
  }
 
  /**
   * 添加干扰点
   */
  protected function drawDisturb()
  {
    for ($i= 0; $i < 100; $i++) {
      imagesetpixel($this->image, mt_rand(0, $this->width), mt_rand(0, $this->height), $this->darkColor());
    }
  }
 
  /**
   * 添加干扰线
   */
  protected function drawArc()
  {
    for ($i = 0; $i < $this->number - 3; $i++) {
      imagearc($this->image, mt_rand(5, $this->width), mt_rand(5, $this->height), mt_rand(5, $this->width), mt_rand(5, $this->height),mt_rand(0, 70), mt_rand(300, 360), $this->darkColor());
    }
  }
 
  /**
   * 输出显示
   */
  protected function show()
  {
    header('Content-Type:image/png');
    imagepng($this->image);
  }
 
  /**
   * 外部image
   */
  public function outImage()
  {
    $this->createImage();//创建画布
    $this->fillColor();//填充背景色
    $this->drawChar();//添加验证字符
    $this->drawDisturb();//添加干扰点
    $this->drawArc();//添加干扰线
    $this->show();//输出
  }
}

展示验证码。。保存验证码和过期时间

<?php
include './code/Code.php';
 
$code = new code\Code();
$code->outImage();
session_start();
$_SESSION['code'] = [
  'code' => $code->code,
  'exp_time' => time() + (60 * 60 * 10),
];

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
数字转英文
Dec 06 PHP
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
php5.3 废弃函数小结
May 16 PHP
ThinkPHP3.1之D方法实例详解
Jun 20 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
Laravel 5框架学习之Blade 简介
Apr 08 PHP
提高php编程效率技巧
Aug 13 PHP
非常有用的9个PHP代码片段
Apr 06 PHP
smarty循环嵌套用法示例分析
Jul 19 PHP
ThinkPHP 模板引擎使用详解
May 07 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
Apr 06 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 #PHP
tp5.1 框架数据库-数据集操作实例分析
May 26 #PHP
tp5.1 框架路由操作-URL生成实例分析
May 26 #PHP
tp5.1 框架join方法用法实例分析
May 26 #PHP
tp5.1框架数据库子查询操作实例分析
May 26 #PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
May 26 #PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 #PHP
You might like
图象函数中的中文显示
2006/10/09 PHP
PHPMailer安装方法及简单实例
2008/11/25 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
2007/04/20 Javascript
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
js控制input输入字符解析
2013/12/27 Javascript
javascript 用函数语句和表达式定义函数的区别详解
2014/01/06 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
JS实现复制功能
2017/03/01 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
通过循环优化 JavaScript 程序
2019/06/24 Javascript
Python松散正则表达式用法分析
2016/04/29 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
python编辑用户登入界面的实现代码
2018/07/16 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
Bootstrap 学习分享
2012/11/12 HTML / CSS
Corelle官方网站:购买康宁餐具
2016/11/02 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
北京爱情故事观后感
2015/06/12 职场文书
个人收入证明范本
2015/06/12 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
优质护理心得体会
2016/01/22 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python