首頁  >  文章  >  後端開發  >  php封裝的驗證碼類

php封裝的驗證碼類

高洛峰
高洛峰原創
2017-02-28 15:14:541055瀏覽

驗證碼是我們開發的時候常用到的功能,所以在此本人包裝了一個驗證碼類,應該可以作為php的類插件用,在此分享給各位讀友。

  實現的原理也是很簡單,就是利用畫布的幾個函數,再加上一些字串的獲取,東湊西湊就構成了,呵呵。

  這裡大概寫一下思路吧,其實這個類已經註釋的非常清楚了,不過,個人還是在行文前囉嗦一下。

  首先是關於一些函數的解釋,這裡的解釋純屬個人體會,有什麼錯誤的地方,還請讀者指正。

  1、建立畫布函數:imagecreatetruecolor(w,h);

    說明:用於建立一個畫布。

    w 畫布的寬

    h 畫布的高

    此函數的返回值資源類(gd)

  2、為畫布創建一種顏色:imagecolorallocate(img,red,green,blue)

    說明:

    img畫布資源

     img畫布資源

     合 〔25045 範圍

  3、為畫布添加背景色

    imagefill(img,x,y,color);

#    #    在image 圖像的座標x,y(圖像左上角為0, 0)

  4、畫邊框

    imagerectangle($img,

##    imagerectangle($img,

##]x2 ,y2,color);

    說明:

    其左上角座標為x1, y1,右下角座標為x2, y2。影像的左上角座標為 0, 0。

  3、繪製內容(字元)

    imagestring(img ,size,x,y,string,color);

     說明:

    img畫布

    size是字大小1至5

    x,y是起始點

     x,y是起始點

     受畫# 是顏色

  4、告訴瀏覽器圖片格式

    header("Content-type:image/png");可為image/gif等等

  5、輸出(或儲存),也可以使用第2個參數實作儲存

    imagepng(img【,filename】)

   聚,filename】)

    imagegif(img【,filename】)

  6、加入乾擾線,本質就是直線

    imageline(img imageline( ,y1,x2,y2,color);

    說明:

      img 畫布1,

##     img 畫布1,

##      終點

      color 顏色

  7、imagettftext ( img,size, angle, x, y, color, fontfile,text )

 #               img 畫布

        size 字體大小,缺省單位像素

                  color 顏色

        fontfile字型文件,必須是中文字體

        text 內容

  特別說明:這裡的color參數都是imagecolorallocate()函數創建的顏色

##  

  這裡最先生成畫布,之後就是為畫布添加字符串,直線,噪點,邊框,來生成驗證碼的,最後類返回的兩個公用接口是:可供外面調用的生成驗證碼的畫布和驗證碼的字串構成,為的是給外界輸出驗證碼畫布,以及儲存字串,作為驗證用

  下面是程式碼:

<?php
namespace captcha;
/*
*验证码类
*verify方法生成验证码字符串
*entry方法生成验证码
*特别提醒:这里要先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法调用captchaImage生成的,所以必须先调用它才行
*有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码
*/
class Captcha{
  //配置参数
  private $config = array();
  //验证码
  private $verifyCode = &#39;&#39;;
  //获取配置文件的配置信息,给类传参数就行,例如new Captcha($config);$config是你的配置文件信息
  public function __construct($config=array(&#39;width&#39;=>100,&#39;height&#39;=>40,&#39;length&#39;=>4,&#39;size&#39;=>7,&#39;lines&#39;=>0,&#39;dots&#39;=>0,&#39;font&#39;=>&#39;simfang.ttf&#39;,&#39;rectangle&#39;=>array(255,55,122),&#39;charset&#39;=>true,&#39;chinese&#39;=>&#39;来到新机场主航站楼建设在婚姻关系存续期间所负债务她在收到要求她偿还前夫在婚姻关系存续期间所欠债务的法院传票后要精益求精善始善终&#39;)){
    $this->config = $config;
  }
  //创建验证码
  private function captchaImage(){
    //画布
    $img = imagecreatetruecolor($this->config[&#39;width&#39;],$this->config[&#39;height&#39;]);
    //填充画布颜色
    imagefill($img,0,0,imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
    //需要边框则画边框
    if($this->config[&#39;rectangle&#39;] && is_array($this->config[&#39;rectangle&#39;]) && count($this->config[&#39;rectangle&#39;]) == 3){
      $this->tangle($img);
    }
    $this->verifyCode = $this->code($img,$this->config[&#39;charset&#39;],$this->config[&#39;chinese&#39;]);
    //存在则添加干扰线
    if($this->config[&#39;lines&#39;]){
      $this->codeLines($img);
    }
    //存在则添加干扰点
    if($this->config[&#39;dots&#39;]){
      $this->codeDots($img);
    }
    return $img;
  }
  private function codeLines($img){
    //绘制干扰线
    for($i=0;$i<$this->config[&#39;lines&#39;];$i++){
      imageline($img,mt_rand(0,$this->config[&#39;width&#39;] / 10),mt_rand(0,$this->config[&#39;height&#39;]),mt_rand($this->config[&#39;width&#39;] * 7/ 10,$this->config[&#39;width&#39;] * 9/ 10),mt_rand(0,$this->config[&#39;height&#39;]),imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)));
    }
  }
  private function codeDots($img){
    //添加噪点
    for($i=0;$i<$this->config[&#39;dots&#39;];$i++){
      //噪点颜色
      $color = imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180));
      imagestring($img,mt_rand(1,3),mt_rand(0,170),mt_rand(0,30),&#39;*&#39;,$color);
    
    }
  }
  /*画布边框*/
  private function tangle($img){
    imagerectangle($img,0,0,$this->config[&#39;width&#39;]-1,$this->config[&#39;height&#39;]-1,imagecolorallocate($img,$this->config[&#39;rectangle&#39;][0],$this->config[&#39;rectangle&#39;][1],$this->config[&#39;rectangle&#39;][2]));
  }
  /*生成验证码,默认英文,$ch为true则为中文*/
  private function code($img,$ch=false,$set=&#39;&#39;){
    $str = "";
    //计算间隔
    $span = ceil($this->config[&#39;width&#39;]/($this->config[&#39;length&#39;]+1));
    if($ch && !empty($set)){
      //随机产生字符
      $set = $this->config[&#39;chinese&#39;];
      for($i=0;$i<$this->config[&#39;length&#39;];$i++){
        $end = strlen($set)/3;
        $pos = mt_rand(0,$end-1);
        $str .= substr($set,$pos*3,3);
      }
      //每次绘制一个字符
      for($i=1;$i<=$this->config[&#39;length&#39;];$i++){
        imagettftext($img,16,mt_rand(-30,60),$i*$span,$this->config[&#39;height&#39;]*3/5,imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)),$this->config[&#39;font&#39;],substr($str,($i-1)*3,3));
      }
    }else{
      //随机生成字母或者数字
      for($i=0;$i<$this->config[&#39;length&#39;];$i++){
        switch(mt_rand(0,2)){
          case 0:
          $str .= chr(mt_rand(65,90));
          break;
        case 1:
          $str .= chr(mt_rand(97,122));
          break;
        case 2:
          $str .= chr(mt_rand(48,57));
        }
      }
      //每次绘制一个字符
      for($i=1;$i<=$this->config[&#39;length&#39;];$i++){
        imagestring($img,$this->config[&#39;size&#39;],$i*$span,0,$str[$i-1],imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)));
      }
    }
    return $str;
  }
  //获取验证码
  public function verify(){
    return $this->verifyCode;
  }
  //生成验证码
  public function entry(){
    header("content-type:image/png");
    imagepng($this->captchaImage());
  }
}
$ob = new Captcha;
$ob->entry();

#最後,為了不誤人子弟,還是再強調一遍:

這裡必須先用entry產生驗證碼,再用verify產生驗證碼的字串,也就是必須先呼叫entry,然後才能夠調用verify產生驗證碼的字串,原因程式碼已經說明問題了,因為驗證碼的字串是在entry方法的方法captchaImage中產生的,所以必須先呼叫它才行有的地方對中文的字體要求比較高,所以,有的地方不支援中文驗證碼

更多php封裝的驗證碼類相關文章請關注PHP中文網!

#
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:PHP的反射API下一篇:PHP的反射API