当前位置: 移动技术网 > IT编程>开发语言>PHP > PHP学习之验证码类

PHP学习之验证码类

2019年05月29日  | 移动技术网IT编程  | 我要评论

杰克森,新恋爱时代程惠,谢双灵

<?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();
    }
}

运行效果:

 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网