php高级实战-验证码类

<?php
$code = new Code(6, 2, 100, 50);
echo $code->outImage();

class Code {
    protected $number;  //验证码个数
    protected $codeType;    //验证码类型
    protected $width;   //图像宽度
    protected $height;  //验证码高度
    protected $code;    //验证码字符串
    protected $image;   //图像资源

    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
     */
    public function __get ($name = 'code') {
        if ('code' == $name) {
            return $this->code;
        }

        return false;
    }

    /*
     * 创建验证码
     */
    private function createCode () {
        switch ($this->codeType) {
            case 0:
                return $this->numberCode();
                break;
            case 1:
                return $this->charCode();
                break;
            case 2:
                return $this->charNumberCode();
                break;
            default:
                return '不支持这种类型的验证码';
        }
    }

    /*
     * 生成纯数字验证码
     */
    private function numberCode () {
        $numberStr = join('', range(0, 9));
        echo substr(str_shuffle($numberStr), 0, $this->number);
    }

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

    /*
     * 生成字母和数字验证码
     */
    private function charNumberCode () {
        $numberStr = join('', range(0, 9));
        $charStr = join('', range('a', 'z'));
        $charNumberStr = $numberStr . $charStr . strtoupper($charStr);

        return substr(str_shuffle($charNumberStr), 0, $this->number);
    }

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

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

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

    /*
     * 深色
     */
    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 - 10);
            $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 < 150; $i++) {
            $x = mt_rand(0, $this->width);
            $y = mt_rand(0, $this->height);
            imagesetpixel($this->image, $x, $y, $this->lightColor());
        }
    }

    /*
     * 将图片显示出来
     */
    protected function show () {
        header('Content-Type:image/png');
        imagepng($this->image);
    }

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值