php高级实战-验证码类

admin
2021-01-21 / 0 评论 / 1,298 阅读 / 正在检测是否收录...

封装类原则


1、该类对外公开的方法只有一个,只要调用这个方法,就可以将验证码显示到浏览器,其他的为这个类服务的方法设置为protected,供子类来继承和重写

2.有些变量在该类里面会被反复的使用到,我们将其保存为成员属性,将不用公开的成员属性设置为protected

验证码个数$number;

验证码类型$codeType;

验证码图像宽度$width;

验证码图像高度$height;

验证码$code;

图像资源$image;

验证码类步骤

1.生成验证码

2.创建画布

3.填充背景色

4.将验证码画到画布中

5.添加干扰元素

6.输出显示

<?PHP
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/2/3
 * Time: 21:13
 */
class Code{
  protected $number;
  protected $height;
  protected $width;
  protected $codeType;
  protected $code;
  protected $image;
  public function __construct($number=4,$codeType=2,$width=100,$height=50)
  {
      //初始成员属性
    $this->number  = $number;
    $this->width   = $width;
    $this->height  = $height;
    $this->codeType= $codeType;
    //生成验证码函数
    $this->code=$this->createCode();
  }
  public function __destruct()
  {
      imagedestroy($this->image);
  }

    public function __get($name){
    if($name =='code'){
        return $this->code;
    }
    return false;
  }
  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;
  }
  protected function getNumberCode(){
      $str=join('',range(0,9));
      return substr(str_shuffle($str),0,$this->number);
  }
  protected function getCharCode(){
      $str=join('',range('a','z'));
      $str=$str.strtoupper($str);
      return substr(str_shuffle($str),0,$this->number);
  }
  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);
  }
  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,36,$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();
  }

}
0

评论 (0)

取消