欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

Php实现验证码功能

程序员文章站 2022-05-21 13:37:55
...
验证码这样的功能可以说是无处不在了,接下来使用php来实现验证码这样的功能,这里我是将验证码实现抽取到一个类中独立开来,那么后面如果再使用到验证码功能,直接引入该类文件并创建该类的实例,就可以使用验证码了,代码如下:

验证码类文件vcode.class.php

width=$width;		$this->height=$height;		$this->num=$num;		$this->code=$this->createCode();		$this->pointNum=100;		$this->lineNum=10;		$this->fontFile="STLITI.TTF";	}		/**	  *用于设置成员属性	  *@param string $key 成员属性名	  *@param mixed $value 成员属性值	  *@return object 返回自己对象$this,可用于连贯操作	  */	public function set($key,$val){		//get_class_vars() 获取类中的属性组成的数组		//get_class() 返回对象的类名		if(array_key_exists($key,get_class_vars(get_class($this)))){			$this->setOption($key,$val);		}		return $this;	}	//设置参数	private function setOption($key,$value){		$this->$key=$value;	}		//获取验证码	public function getCode(){		return $this->code;	}		//输出图像	public function outImg(){		//创建图像		$this->createImage();		//画验证码		$this->drawCode();		//画干扰元素		$this->drawDisturbColor();		//输出图像		$this->printImg();	}		//画验证码	private function drawCode(){		$this->fontFile="./font/".$this->fontFile;		for($i=0;$inum;$i++){			//设置随机颜色			$randColor=imagecolorallocate($this->img,rand(0,128),rand(0,128),rand(0,128));			//字体大小			$fontSize=rand(20,23);			//字体水平位置			$x=($this->width/$this->num)*$i;			//水平方向的位置			$y=rand($fontSize,imagefontheight($fontSize)+3);			//画字体			imagettftext($this->img,$fontSize,0,$x,$y,$randColor,$this->fontFile,$this->code{$i});		}	}	//画干扰元素	private function drawDisturbColor(){		//画干扰点		for($i=0;$ipointNum;$i++){			//设置随机颜色			$randColor=imagecolorallocate($this->img,rand(0,255),rand(0,255),rand(0,255));			//画点			imagesetpixel($this->img,rand(1,$this->width-2),rand(1,$this->height-2),$randColor);		}				//画干扰线		for($i=0;$ilineNum;$i++){			//设置随机颜色			$randColor=imagecolorallocate($this->img,rand(0,200),rand(0,200),rand(0,200));			//画线			imageline($this->img,rand(1,$this->width-2),rand(1,$this->height-2),rand(1,$this->height-2),rand(1,$this->width-2),$randColor);		}	}		//创建图像	private function createImage(){		//创建一个真彩色图像		$this->img=imagecreatetruecolor($this->width,$this->height);		//设置背景色		$bgColor=imagecolorallocate($this->img,rand(200,255),rand(200,255),rand(200,255));		//填充背景色		imagefill($this->img,0,0,$bgColor);		//设置边框颜色		$borderColor=imagecolorallocate($this->img,0,0,0);		//画一个边框		imagerectangle($this->img,0,0,$this->width-1,$this->height-1,$borderColor);	}		//输出图像	private function printImg(){		if(imagetypes() & IMG_PNG){			//针对png			header("Content-Type:image/png");			imagepng($this->img);		}else if(imagetypes() & IMG_JPG){			//针对jpg			header("Content-Type:image/jpeg");			imagejpeg($this->img,null,100);		}else if(imagetypes() & IMG_GIF){			//针对Gif			header("Content-Type:image/gif");			imagegif($this->img);		}else if(imagetypes() & IMG_WBMP){			// 针对 WBMP			header('Content-Type: image/vnd.wap.wbmp');			imagewbmp($this->img);		}else{			die('No image support in this PHP server');		}	}		//创建验证码	private function createCode(){		//默认字符串		$codes="123456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY";		//生成验证码		$code="";		for($i=0;$inum;$i++){			$code.=$codes{rand(0,strlen($codes)-1)};		}		return $code;	}		//析构函数用于销毁图像资源	function __destruct(){		imagedestroy($this->img);	}  }

这里我使用的画字体的函数是imagettftext(),因为这个函数可以自定义字体样式,从代码中也能看出来,传入的参数有个字体文件属性,如果不喜欢用这个函数可以使用imagestring()函数也行,只不过个人觉得这个函数的默认字体大小,也不好看。还是自定义字体看着舒服点。接下来是调用验证码类

getCode();	//$vcode->set("pointNum",10);//自定义干扰点个数	//$vcode->set("lineNum",10);//自定义干扰线个数	//$vcode->set("fontFile","wawa.ttf");//自定义字体文件	//输出图像	$vcode->outImg();

代码到这里验证码就实现了,直接调用该文件也能看到验证码,下面使用一个简单的登录表单使用该验证码

alert('验证码正确!');";		}else{			echo "";		}	}?>			
  • Php实现验证码功能

实现的效果: