咔叽游戏

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 372|回复: 0

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

[复制链接]
  • TA的每日心情
    无聊
    2019-5-27 08:20
  • 签到天数: 4 天

    [LV.2]圆转纯熟

    发表于 2020-7-6 22:17:45 | 显示全部楼层 |阅读模式
    本文实例讲述了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图形与图片操作技巧汇总》、《PHP数组(Array)操作技巧大全》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数学运算技巧总结》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》
    希望本文所述对大家PHP程序设计有所帮助。

    原文地址:https://www.jb51.net/article/187408.htm

    QQ|免责声明|小黑屋|手机版|Archiver|咔叽游戏

    GMT+8, 2024-3-29 16:28

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表