Maison >développement back-end >tutoriel php >PHP implémente une classe de code de vérification encapsulée

PHP implémente une classe de code de vérification encapsulée

墨辰丷
墨辰丷original
2018-05-25 09:51:521666parcourir

Cet article partage avec vous le code, les principes et les idées d'une classe de code de vérification encapsulée en PHP. Il est très clair et détaillé. Les amis dans le besoin peuvent s'y référer

Les codes de vérification sont souvent utilisés lorsque nous. développer Les fonctions utilisées, j'ai donc emballé ici une classe de code de vérification, qui devrait être utilisée comme plug-in de classe PHP. J'aimerais la partager avec tous les lecteurs.

Le principe de mise en œuvre est également très simple, qui consiste à utiliser plusieurs fonctions de la toile, plus l'acquisition de quelques ficelles, et à reconstituer le tout, haha.

Permettez-moi d'écrire brièvement mes réflexions ici. En fait, ce cours a été commenté très clairement, mais je veux quand même être verbeux avant d'écrire.

Tout d'abord, l'explication de certaines fonctions. L'explication ici est une expérience purement personnelle. S'il y a des erreurs, veuillez me corriger.

1. Fonction de création de canevas : imagecreatetruecolor(w,h);

Description : Utilisé pour créer un canevas.

 w La largeur du canevas

 h La hauteur du canevas

 La valeur de retour de cette fonction Classe de ressources (gd)

2. Créer pour le canevas Une couleur : imagecolorallocate(img, rouge, vert, bleu)

Description :

ressource de canevas img

rouge, vert, bleu est compris entre 0 et 255

3. Ajoutez une couleur d'arrière-plan au canevas

imagefill(img,x,y,color);

Description :

Dans l'image coordonnées ,y2,color);

Explication : Les coordonnées de son coin supérieur gauche sont x1, y1, et les coordonnées de son coin inférieur droit sont x2, y2. Le coin supérieur gauche de l'image a les coordonnées 0, 0.

3. Contenu du dessin (caractères)

chaîne d'images (img, taille, x, y, chaîne, couleur

Description : img canvas

size est la taille des caractères 1 à 5

x, y est le point de départ

string est le contenu à dessiner

color C'est la couleur

4. Indiquez au navigateur le format de l'image

Header("Content-type:image/png"); gif, etc.

5. Sortie (ou enregistrer), vous pouvez également utiliser le deuxième paramètre pour enregistrer

Imagepng(img【,filename】)

imagejpeg(img【 ,filename])

Imagegif(img【,filename】)

6. Ajoutez des lignes d'interférence, qui sont essentiellement des lignes droites

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

                     img   Canvas

   x1,y1 Point de départ

  x2,y2 Point d'arrivée

Couleur couleur

7. imagettftext ( img, taille, angle, x, y, couleur, fichier de police, texte)

Description :

img canevas

taille taille de la police, unité par défaut pixels

angle angle

point de coordonnées x,y

couleur couleur

fontfile Les fichiers de polices doivent être des polices chinoises

Contenu du texte

Remarque spéciale : les paramètres de couleur ici sont toutes les couleurs créées par la fonction imagecolorallocate()

Voici l'idée suivante :

Le canevas est d'abord généré ici, puis des chaînes, des lignes droites, des points de bruit et des bordures sont ajoutés au canevas pour générer des codes de vérification. Enfin, les deux interfaces publiques renvoyées par la classe sont : canevas pour. générer des codes de vérification qui peuvent être appelés à l'extérieur et La composition de la chaîne du code de vérification consiste à afficher le canevas du code de vérification vers le monde extérieur et à stocker la chaîne pour vérification

Voici le code :

Enfin, afin de ne pas induire les autres en erreur, permettez-moi de le souligner encore une fois :

Ici, vous devez d'abord utiliser l'entrée pour générer le code de vérification, puis utiliser verify pour générer la chaîne de code de vérification. Autrement dit, l'entrée doit être appelée en premier, puis Verify peut être appelé pour générer une chaîne de code de vérification. Le code de raison a déjà expliqué le problème, car la chaîne de code de vérification est générée dans la méthode captchaImage de. la méthode de saisie, elle doit être appelée en premier. Certains endroits nécessitent une comparaison des polices chinoises High, donc certains endroits ne prennent pas en charge les codes de vérification chinois

Ce qui précède représente l'intégralité du contenu de cet article. , j'espère que cela sera utile à l'apprentissage de chacun.
<?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();


Recommandations associées :

méthode de transfert de valeur php et méthode ajax pour implémenter la fonction de

vérification


Comment résoudre le problème selon lequel une erreur apparaît toujours lorsque ajax renvoie une

vérification

PHP implémente des expressions régulières

Vérifier méthode de classe publique d'assistance

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn