欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP学习之验证码类

程序员文章站 2022-06-22 13:01:54
运行效果: ......
<?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();
    }
}

运行效果:

PHP学习之验证码类