PHP学习之验证码类

<?php
$code = new Code();
$code->outImage();
class Code
{
    //验证码个数
    protected $number;
    //验证码类型
    protected $codeType;
    //图像宽度
    protected $width;
    //图像高度
    protected $height;
    //图像资源
    protected $image;
    //验证码字符串
    protected $code;

    /**
     * Undocumented function
     *
     * @param integer $number
     * @param integer $codeType
     * @param integer $width
     * @param integer $height
     */
    public function __construct($number = 4, $codeType = 2, $width = 100, $height = 50)
    {
        //初始化自己的成员属性
        $this->number = $number;
        $this->codeType = $codeType;
        $this->width = $width;
        $this->height = $height;

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

    /**
     * 析构函数
     * 释放图像资源
     */
    public function __destruct()
    {
        //释放图像资源
        imagedestroy($this->image);
    }

    
    /**
     * //魔术方法   通过对象获取保护的code
     * $code = new Code();
     * echo $code->code;
     *
     * @param [type] $name
     * @return void
     */
    public function __get($name)
    {
        if ($name == 'code') {
            return $this->code;
        }
        return false;
    }

    /**
     * 获取验证码
     *
     * @return void
     */
    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:
                die('不支持这种验证码类型');
        }
        return $code;
    }

    /**
     * 生成纯数字验证码
     *
     * @return void
     */
    protected function getNumberCode()
    {
        // $startNum = pow(10, $this->number - 1);
        // $endNum = pow(10, $this->number) - 1;
        // $str = rand($startNum, $endNum);
        // return $str;
        $str = join('', range(0, 9));
        return substr(str_shuffle($str), 0, $this->number);
    }

    /**
     * 生成纯字母验证码
     *
     * @return void
     */
    protected function getCharCode()
    {
        $str = join('', range('a', 'z'));
        $str = $str . strtoupper($str);
        return substr(str_shuffle($str), 0, $this->number);
    }

    /**
     * 生成字母和数字验证码
     *
     * @return void
     */
    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->number);
    }

    /**
     * 创建画布
     *
     * @return void
     */
    protected function createImage()
    {
        $this->image = imagecreatetruecolor($this->width, $this->height);
    }

    /**
     * 填充背景颜色
     *
     * @return void
     */
    protected function fillBack()
    {
        imagefill($this->image, 0, 0, $this->lightColor());
    }

    /**
     * 随机生成浅颜色
     *
     * @return void
     */
    protected function lightColor()
    {
        return imagecolorallocate($this->image, mt_rand(130, 255), mt_rand(130, 255), mt_rand(130, 255));
    }

    /**
     * 随机生成深颜色
     *
     * @return void
     */
    protected function darkColor()
    {
        return imagecolorallocate($this->image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
    }

    /**
     * 将验证码字符串画到画布中
     *
     * @return void
     */
    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 - 10);
            $y = mt_rand(0, $this->height - 15);
            imagechar($this->image, 5, $x, $y, $this->code[$i], $this->darkColor());
        }
    }

    /**
     * 添加干扰项
     *
     * @return void
     */
    protected function drawDisturb()
    {
        for ($i = 0; $i < 150; $i++) {
            $x = mt_rand(0, $this->width);
            $y = mt_rand(0, $this->height);
            imagesetpixel($this->image, $x, $y, $this->lightColor());
        }
    }

    /**
     * 输出并且显示
     *
     * @return void
     */
    protected function show()
    {
        header('Content-Type:image/png');
        imagepng($this->image);
    }

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

运行效果:

 
原文地址:https://www.cnblogs.com/shengChristine/p/10936100.html