我们已经准备好了,你呢?

2026我们与您携手共赢,为您的企业形象保驾护航!

更新时刻:2016年10月14日15点21分01秒,发布者:

本课程借助PHP编程语言及Web前端技术,成功打造了一个网站注册登录界面,涉及PHP编程技能的学习与实践,对感兴趣的同学来说,是一个值得参考的实例。

本文主要阐述了如何利用PHP技术构建用户注册与登录系统,该系统包含四个主要模块:一是设计前端界面,二是生成验证码,三是实现注册和登录功能,四是进行功能优化。更多细节,敬请继续阅读。

验证码制作

一、实验简介

本次实验旨在引导大家运用面向对象的理念来构建一个验证码模块,并在注册及登录页面中实际应用这一模块。通过参与此次实验,你将深入理解 PHP 的面向对象编程(OOP)理念,掌握 GD 库的运用技巧,以及验证码的生成方法。

1.1 涉及到的知识点

1.2 开发工具

这是一款便捷高效的文字处理工具。在桌面的左下角,您可以通过以下路径进入:应用程序菜单,选择开发选项。

二、封装验证码类

2.1 建立目录以及准备字体

在 web 文件夹中创建一个名为 admin 的子文件夹,将其作为我们的管理后台文件夹,并将后台的代码文件存放于此。在 admin 文件夹内部,再设立一个专门的 fonts 文件夹,该文件夹将用于储存制作验证码所必需的字体资源。

在admin目录中创建一个.php文件,该文件正是我们计划进行编辑的验证码相关类文件。

当前目录层次结构:

PHP面向对象编程实践_php web开发学习实录_PHP验证码制作教程

编辑 .php 文件:

添加该类的私有属性和构造方法:

string = 'qwertyupmkjnhbgvfcdsxa123456789'; // 删除了部分相似的字母
    $this->codeNum = $codeNum;
    $this->height = $height;
    $this->width = $width;
    $this->lineFlag = $lineFlag;
    $this->piexFlag = $piexFlag;
此对象的字体属性被设置为当前文件所在目录下的'fonts'子目录中的'consola.ttf'字体文件。
    $this->fontSize = $fontSize;
  }
}

字体文件可通过以下命令下载到 fonts 目录:

$ wget

接下来开始编写具体的方法:

创建图像资源句柄

//创建图像资源  
此操作创建了图像资源,其尺寸为宽度:$this->width,高度:$this->height,通过调用imagecreate函数实现。
使用imagecolorallocate函数为图像分配颜色,选取的RGB值均在0到100之间,以此实现背景的浅色填充。
  }

用到的相关函数

创建验证码字符串并输出到图像

//创建验证码  
public function createCode(){
将字符串长度减一赋值给变量$strlen。
    for ($i=0; $i < $this->codeNum; $i++) { 
将随机选取的四个字符从字符集中连接,此操作被加入到代码字符串中。
    }
将代码信息存入会话变量中,具体操作是将当前实例的code属性值赋值给$_SESSION数组中的code键。
  
   //计算每个字符间距
计算差异值时,将宽度除以编码数量,得到 $diff。
    for ($i=0; $i < $this->codeNum; $i++) { 
          //为每个字符生成颜色(使用深色)
在分配图像颜色时,我使用了imagecolorallocate函数,为当前图像img指定了一个随机生成的RGB颜色值,该值由三个随机数组成,每个数介于100到255之间。
     //写入图像
调用imagettftext函数,将文本输出至图像中,设定字体大小为当前对象字体大小,随机偏移角度在-30至30度之间,位置坐标为差值乘以索引加上随机偏移量,垂直位置在20至对象高度减10之间,使用指定文本颜色,指定字体文件,以及当前对象的编码数组中的第i个元素。
    }
  }

用到的相关函数

创建验证码字符串并输出到图像

//创建验证码  
public function createCode(){
    $strlen = strlen($this->string)-1;
    for ($i=0; $i < $this->codeNum; $i++) { 
      $this->code .= $this->string[mt_rand(0,$strlen)];  //从字符集中随机取出四个字符拼接
    }
     $_SESSION['code'] = $this->code;  //加入 session 中
  
   //计算每个字符间距
    $diff = $this->width/$this->codeNum;
    for ($i=0; $i < $this->codeNum; $i++) { 
          //为每个字符生成颜色(使用深色)
     $txtColor = imagecolorallocate($this->img,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255));
     //写入图像
      imagettftext($this->img, $this->fontSize, mt_rand(-30,30), $diff*$i+mt_rand(3,8), mt_rand(20,$this->height-10), $txtColor, $this->font, $this->code[$i]);
    }
  }

用到的相关函数:

创建干扰线条

//创建干扰线条(默认四条)
    for ($i=0; $i < 4; $i++) { 
      $color = imagecolorallocate($this->使用随机生成的数值,对颜色进行设定,其中,RGB值分别为:img,mt_rand(0,155),mt_rand(0,155),mt_rand(0,155),确保色调偏向浅色。
向图像中绘制一条线,起点坐标为随机生成的宽度和高度范围内,终点坐标同样为随机生成的宽度和高度范围内,线段颜色由指定参数决定。
    }
  }

用到的相关函数:

创建干扰点

//创建干扰点 (默认一百个点)
public function createPiex(){
    for ($i=0; $i < 100; $i++) { 
      $color = imagecolorallocate($this->执行img函数,参数分别为从0到255中随机生成的三个整数,逗号分隔。
此操作将在当前图像对象中随机指定一个位置,并使用指定的颜色填充该点,具体位置由随机生成的横坐标和纵坐标决定,横坐标范围从0到图像宽度,纵坐标范围从0到图像高度。
    }
  }

使用的相关函数:

对外输出图像:

 public function show()
  {
    $this->createImage();
    $this->createCode();
若此处的行标记被激活,则表示将生成干扰线。
      $this->createLines();
    }
若启用了该功能,则进行干扰点的创建操作。
      $this->createPiex();
    }
设置HTTP头部信息为指示内容类型为PNG图像格式;请求显示的页面内容应为PNG格式的图片。
将图像以PNG格式进行输出,使用imagepng函数处理。
销毁图像资源,并释放所占用的内存空间,执行imagedestroy($this->img)操作。
  }

用到的相关函数:

对外提供验证码:

public function getCode(){
    return $this->code;
  }
完整代码如下:
字符串变量定义为qwertyupmkjnhbgvfcdsxa123456789。
    $this->codeNum = $codeNum;
    $this->height = $height;
    $this->width = $width;
    $this->lineFlag = $lineFlag;
    $this->piexFlag = $piexFlag;
    $this->font = dirname(__FILE__).'/fonts/consola.ttf';
    $this->fontSize = $fontSize;
  }
public方法createImage执行时,将生成一张图像。
此操作将创建一个图像资源,其尺寸为宽度为 $this->width,高度为 $this->height;$this->img 变量将被赋予该图像资源。
此操作中,我们使用imagecolorallocate函数为图像分配颜色,所选颜色由三个随机生成的数值决定,这三个数值分别位于0到100的范围内。
  }
  public function createCode(){
    $strlen = strlen($this->string)-1;
    for ($i=0; $i < $this->codeNum; $i++) { 
此代码段将随机选取字符串数组中的一个元素,并将其追加到当前代码的变量“code”中。
    }
将代码信息存储于会话变量中,具体操作是将实例的code属性值赋值给$_SESSION数组中的code键。
    $diff = $this->width/$this->codeNum;
    for ($i=0; $i < $this->codeNum; $i++) { 
为图像分配随机颜色,该颜色由三个随机值组成,每个值介于100到255之间,分别对应红色、绿色和蓝色通道。
      imagettftext($this->img, $this->fontSize, mt_rand(-30,30), $diff*$i+mt_rand(3,8), mt_rand(20,$this->height-10), $txtColor, $this->font, $this->code[$i]);
    }
  }
public方法 createLines负责生成线条
    for ($i=0; $i < 4; $i++) { 
      $color = imagecolorallocate($this->执行img,使用mt_rand函数在0到155之间随机生成三个数值,分别对应mt_rand(0,155),mt_rand(0,155),mt_rand(0,155)。
      imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color); 
    }
  }
public方法中定义了一个名为createPiexs的函数。
    for ($i=0; $i < 100; $i++) { 
      $color = imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
      imagesetpixel($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
    }
  }
  public function show()
  {
    $this->createImage();
    $this->createCode();
    if ($this->lineFlag) {
      $this->createLines();
    }
    if ($this->piexFlag) {
      $this->createPiexs();
    }
发送响应头信息,指定内容类型为图片PNG格式。
    imagepng($this->img);
    imagedestroy($this->img);
  }
  public function getCode(){
    return $this->code;
  }
}

这就是验证码相关代码的全部内容。它看起来确实相当简单,但其中涉及了不少图像处理函数。对于这些函数,我已经提供了相应的链接和详细的使用说明。这些函数并不需要强行记忆,如果遇到不明白的地方,可以随时查阅 PHP 的官方文档,而且还有中文版的文档可供参考。

2.2 使用验证码

既然封装工作已经完成,那么便可以着手应用。为了便于操作,我们可以在该类之后直接调用此类。

session_start(); //开启session
创建了一个验证码对象$captcha,该对象基于验证码类(支持自定义参数)。
$captcha->show();  //调用输出

三、前端展示

后端已成功设置好验证码,因此前端界面现在可以展示出来。请对 index.php 文件中的注册和登录表单部分进行验证码相关内容的调整。

PHP验证码制作教程_php web开发学习实录_PHP面向对象编程实践 Click to Switch

img标签中嵌入的代码赋予了点击功能,从而使得用户能够通过点击操作来更换验证码。

效果图:

PHP验证码制作教程_php web开发学习实录_PHP面向对象编程实践

四、完善

截至目前,我们的验证码功能模块已基本定型。经过这一阶段的学习,大家对面向对象编程的概念应该有了更深入的认识。同时,也对面向对象编程的思想有所体会。面向对象编程的三大核心特性包括封装、继承和多态。在本次开发中,我们主要运用了封装的概念。大家可以对验证码类进行进一步的优化和升级,设计出更加完善的类结构。该实验向我们揭示了PHP函数众多的事实,提醒我们不应死记硬背,而应多查阅官方文档。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/10460.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线