php验证码类

在登陆或者回复的时候,我们会经常使用到验证码。因此我最近就封装了一个基于GD图形库的验证码生成类,方便日后的使用。如果其中有什么问题欢迎回复我修改此类

<?php

/**
 * Created by PhpStorm.
 * User: Edwin
 * Date: 2017/9/19
 * Time: 16:36
 *
 * 验证码类
 * 1.生成验证码
 * 2.创建画布
 * 3.填充背景色
 * 4.将验证码画到画布上
 * 5.添加干扰元素
 * 6.输出显示
 * -------------------------------
 * @prarm int $num  验证码个数
 * @prarm $codeType 验证码类型
 * @prarm $width    验证码图像宽度
 * @prarm $height   验证码图像高度
 * @prarm $code     验证码
 * @prarm $img      图像资源
 */
class Code {
    protected $num;
    protected $codeType;
    protected $width;
    protected $height;
    protected $code;
    protected $img;

    /**
     * 构造方法
     * @param integer $num      验证码字符数量
     * @param integer $codeType 验证码类型,0为纯数字,1为纯字母,2为数字和字母混合
     * @param integer $width    验证码宽度
     * @param integer $height   验证码高度
     */
    public function __construct($num = 4, $codeType = 2, $width = 100, $height = 50) {
        //初始化自己的成员变量
        $this->num = $num;
        $this->codeType = $codeType;
        $this->width = $width;
        $this->height = $height;

        //生成验证码函数
        $this->code = $this->createCode();
    }

    /**
     * 魔术变量
     */
    public function __toString() {
        $_SESSION['code'] = $this->code;
        $this->outImage();
        return '';
    }

    /**
     * 创建验证码
     * @return string $code 验证码值
     */
    protected function createCode() {
        switch ($this->codeType) {
        case 0: //纯数字
            $code = $this->getNumberCode();
            break;
        case 1: //纯字母
            $code = $this->getCharCode();
            break;
        case 2: //数字和字母混合
            $code = $this->getNumCharCode();
            break;
        default: //默认为数字和字母混合
            $code = $this->getNumCharCode();
            break;
        }
        return $code;
    }

    /**
     * 获取数字验证码
     * 1.生成随机数字
     * 2.把字符串随机打乱并进行截取
     * ----------------------------
     * @return string
     */
    protected function getNumberCode() {
        $str = join('', range(0, 9));
        return substr(str_shuffle($str), 0, $this->num);
    }

    /**
     * 获取字母混合后的字符串验证码
     * 1.生成随机字符串
     * 2.把字母转换为大写后进行小写和大写的拼接
     * 3.随机打乱字符串中的所有字符并截取字符
     * -------------------------------------
     * @return string
     */
    protected function getCharCode() {
        $str = join('', range('a', 'z'));
        $str = $str . strtoupper($str);
        return substr(str_shuffle($str), 0, $this->num);
    }

    /**
     * 获取数字和字母混合的字符串
     * 1.生成随机数字
     * 2.生成随机字母
     * 3.把字母转换为大写后进行小写和大写的拼接
     * 4.随机打乱字符串中的所有字符并截取字符
     * --------------------------------------
     * @return string 返回字符串
     */
    protected function getNumCharCode() {
        $numStr = join('', range(0, 9));
        $str = join('', range('a', 'z'));
        $str = $numStr . $str . strtoupper($str);
        return substr(str_shuffle($str), 0, $this->num);
    }

    /**
     * 新建一个真彩色图像
     */
    protected function createImage() {
        $this->img = imagecreatetruecolor($this->width, $this->height);
    }

    /**
     * 图像区域填充
     */
    protected function fillBack() {
        imagefill($this->img, 0, 0, $this->lightColor());
    }

    /**
     * 获取浅色
     */
    protected function lightColor() {
        return imagecolorallocate($this->img, mt_rand(130, 255), mt_rand(130, 255), mt_rand(130, 255));
    }

    /**
     * 获取深色
     */
    protected function darkColor() {
        return imagecolorallocate($this->img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
    }

    /**
     * 绘制字符
     */
    protected function drawChar() {
        $width = ceil($this->width / $this->num);
        for ($i = 0; $i < $this->num; $i++) {
            $x = mt_rand($i * $width + 5, ($i + 1) * $width - 10);
            $y = mt_rand(0, $this->height - 15);
            imagechar($this->img, 5, $x, $y, $this->code[$i], $this->darkColor());
        }
    }

    /**
     * 添加干扰元素
     * 1.生成干扰点
     * 2.生成干扰线
     */
    protected function drawDisturb() {

        for ($i = 0; $i < 150; $i++) {
            $x = mt_rand(0, $this->width);
            $y = mt_rand(0, $this->height);
            imagesetpixel($this->img, $x, $y, $this->lightColor());
        }
        for ($i = 0; $i < 5; $i++) {
            $x = mt_rand(0, $this->width);
            $y = mt_rand(0, $this->height);
            $x1 = mt_rand(0, $this->width);
            $y1 = mt_rand(0, $this->height);
            imageline($this->img, $x, $y, $x1, $y1, $this->lightColor());
        }
    }

    /**
     * 展示图片
     */
    protected function show() {
        header('Content-Type:image/png');
        imagepng($this->img);
        imagedestroy($this->img);
    }

    /**
     * 生成验证码流程
     */
    public function outImage() {
        //创建画布
        $this->createImage();
        //填充背景色
        $this->fillBack();
        //将验证码字符串画到画布中
        $this->drawChar();
        //添加干扰元素
        $this->drawDisturb();
        //输出并且显示
        $this->show();
    }

    /**
     * 析构方法
     */
    public function __destruct() {
        imagedestroy($this->img);
    }
}

7 条评论

发表评论

*