一个经典的PHP验证码类分享
我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode。将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中。只要在创建对象时,为构造方法提供三个参数,包括创建验证码图片的宽度、高度及验证码字母个数,就可以成功创建一个验证码类的对象。该类的声明代码如下所示:
<?php
classVcode{
private$width;//宽
private$height;//高
private$num;//数量
private$code;//验证码
private$img;//图像的资源
//构造方法,三个参数
function__construct($width=80,$height=20,$num=4){
$this->width=$width;
$this->height=$height;
$this->num=$num;
$this->code=$this->createcode();//调用自己的方法
}
//获取字符的验证码,用于保存在服务器中
functiongetcode(){
return$this->code;
}
//输出图像
functionoutimg(){
//创建背景(颜色,大小,边框)
$this->createback();
//画字(大小,字体颜色)
$this->outstring();
//干扰元素(点,线条)
$this->setdisturbcolor();
//输出图像
$this->printimg();
}
//创建背景
privatefunctioncreateback(){
//创建资源
$this->img=imagecreatetruecolor($this->width,$this->height);
//设置随机的背景颜色
$bgcolor=imagecolorallocate($this->img,rand(225,255),rand(225,255),rand(225,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);
}
//画字
privatefunctionoutstring(){
for($i=0;$i<$this->num;$i++){
$color=imagecolorallocate($this->img,rand(0,128),rand(0,128),rand(0,128));
$fontsize=rand(3,5);//字体大小
$x=3+($this->width/$this->num)*$i;//水平位置
$y=rand(0,imagefontheight($fontsize)-3);
//画出每个字符
imagechar($this->img,$fontsize,$x,$y,$this->code{$i},$color);
}
}
//设置干扰元素
privatefunctionsetdisturbcolor(){
//加上点数
for($i=0;$i<100;$i++){
$color=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),$color);
}
//加线条
for($i=0;$i<10;$i++){
$color=imagecolorallocate($this->img,rand(0,255),rand(0,128),rand(0,255));
imagearc($this->img,rand(-10,$this->width+10),rand(-10,$this->height+10),rand(30,300),rand(30,300),55,44,$color);
}
}
//输出图像
privatefunctionprintimg(){
if(imagetypes()&IMG_GIF){
header("Content-type:image/gif");
imagegif($this->img);
}elseif(function_exists("imagejpeg")){
header("Content-type:image/jpeg");
imagegif($this->img);
}elseif(imagetypes()&IMG_PNG){
header("Content-type:image/png");
imagegif($this->img);
}else{
die("NoimagesupportinthisPHPserver");
}
}
//生成验证码字符串
privatefunctioncreatecode(){
$codes="3456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY";
$code="";
for($i=0;$i<$this->num;$i++){
$code.=$codes{rand(0,strlen($codes)-1)};
}
return$code;
}
//用于自动销毁图像资源
function__destruct(){
imagedestroy($this->img);
}
}
在上面的脚本中,虽然声明验证码类Vcode的代码比较多,但细节都被封装在类中,只要直接输出对象,就可以向客户端浏览器中输出幅图片,并可以在浏览器表单中使用。另外本类自动获取验证码图片中的字符串,促成在服务的$_SESSION["code"]中。在提交表单时,只有用户在表单中输入验证码图片上显示的文字,并和服务器中保留的验证码字符串完全相同时,表单才可以提交成功。(注意:验证码在服务器端在$_SESSION["code"]中,所以必须开启session会话才能使用该类,)
在下面的脚本code.php中,使用session_start()开启用户会话控制,然后包含验证码类Vcode所在文件vcode.class.php,创建该类对象并直接输出。就可以将随机生成的验证码图片发送出去,同时会自动将这个验证码字符串保存在服务器中一份。代码如下所示:
<?php //开启session session_start(); include"vcode.class.php"; //构造方法 $vcode=newVcode(80,30,4); //将验证码放到服务器自己的空间保存一份 $_SESSION['code']=$vcode->getcode(); //将验证码图片输出 $vcode->outimg(); ?>
表单代码如下所示:
<?php
session_start();
if(isset($_POST['dosubmit'])){
if(strtoupper($_SESSION['code'])==strtoupper($_POST['code'])){
echo"输入成功!<br>";
}else{
echo"输入不对!<br>";
}
}
?>
<body>
<formaction="reg.php"method="post">
username:<inputtype="text"name="username"><br>
password:<inputtype="password"name="password"><br>
code:<inputtype="text"onkeyup="if(this.value!=this.value.toUpperCase())this.value=this.value.toUpperCase()"size="6"name="code">
<imgsrc="code.php"onclick="this.src='code.php?'+Math.random()"/><br>
<inputtype="submit"name="dosubmit"value="登录"><br>
</form>
</body>
PHP经典验证码类下载:
PHP验证码类.rar