个人写的PHP验证码生成类分享

这篇文章主要介绍了个人写的PHP验证码生成类分享,此验证码类直接拿去就可以用,也可以用来学习和分析,需要的朋友可以参考下。

此验证码类直接拿去就可以用,也可以参考!

其中类成员codestr是生成的验证码字符串:

  1. <?php
  2. /**
  3. * 验证码
  4. */
  5. class Code{
  6. // 1. 定义各个成员 有宽、高、画布、字数、类型、画类型
  7. private $width; //宽度
  8. private $height; //高度
  9. private $num; //验证码字数
  10. private $imgType; //生成图片类型
  11. private $Type; //字串类型 1,2,3 三个选项 1 纯数字 2 纯小写字母 3 大小写数字混合
  12. private $hb; //画布
  13. public $codestr; // 验证码字串
  14. public function __construct($height=20,$num=4,$imgType="jpeg",$Type=1){
  15. $this->width = $num*20;
  16. $this->height = $height;
  17. $this->num = $num;
  18. $this->imgType = $imgType;
  19. $this->Type = $Type;
  20. $this->codestr = $this->codestr();
  21. $this->zuhe();
  22. }
  23. // 2. 定义随机获取字符串函数
  24. private function codestr(){
  25. switch($this->Type){
  26. case 1: // 类型为1 获取1-9随机数
  27. $str = implode("",array_rand(range(0,9),$this->num));
  28. break;
  29. case 2: // 类型为2 获取a-z随机小写字母
  30. $str = implode("",array_rand(array_flip(range(a,z)),$this->num));
  31. break;
  32. case 3: // 类型为3 获取数字,小写字母,大写字母 混合
  33. for($i=0;$i<$this->num;$i++){
  34. $m = rand(0,2);
  35. switch($m){
  36. case 0:
  37. $o = rand(48,57);
  38. break;
  39. case 1:
  40. $o = rand(65,90);
  41. break;
  42. case 2:
  43. $o = rand(97,122);
  44. break;
  45. }
  46. $str .= sprintf("%c",$o);
  47. }
  48. break;
  49. }
  50. return $str;
  51. }
  52. // 3. 初始化画布图像资源
  53. private function Hb(){
  54. $this->hb = imagecreatetruecolor($this->width,$this->height);
  55. }
  56. // 4. 生成背景颜色
  57. private function Bg(){
  58. return imagecolorallocate($this->hb,rand(130,250),rand(130,250),rand(130,250));
  59. }
  60. // 5. 生成字体颜色
  61. private function Font(){
  62. return imagecolorallocate($this->hb,rand(0,100),rand(0,100),rand(0,100));
  63. }
  64. // 6. 填充背景颜色
  65. private function BgColor(){
  66. imagefilledrectangle($this->hb,0,0,$this->width,$this->height,$this->Bg());
  67. }
  68. // 7. 干扰点
  69. private function ganrao(){
  70. $sum=floor(($this->width)*($this->height)/3);
  71. for($i=0;$i<$sum;$i++){
  72. imagesetpixel($this->hb,rand(0,$this->width),rand(0,$this->height),$this->Bg());
  73. }
  74. }
  75. // 8. 随机直线 弧线
  76. private function huxian(){
  77. for($i=0;$i<$this->num;$i++){
  78. imageArc($this->hb,rand(0,$this->width),rand(0,$this->height),rand(0,$this->width),rand(0,$this->height),rand(0,360),rand(0,360),$this->Bg());
  79. }
  80. }
  81. // 9. 写字
  82. private function xiezi(){
  83. for($i=0;$i<$this->num;$i++){
  84. $x=ceil($this->width/$this->num)*$i;
  85. $y=rand(1,$this->height-15);
  86. imagechar($this->hb,5,$x+4,$y,$this->codestr[$i],$this->Font());
  87. }
  88. }
  89. // 10. 输出
  90. private function OutImg(){
  91. $shuchu="image".$this->imgType;
  92. $header="Content-type:image/".$this->imgType;
  93. if(function_exists($shuchu)){
  94. header($header);
  95. $shuchu($this->hb);
  96. }else{
  97. exit("GD库没有此类图像");
  98. }
  99. }
  100. // 11. 拼装
  101. private function zuhe(){
  102. $this->Hb();
  103. $this->BgColor();
  104. $this->ganrao();
  105. $this->huxian();
  106. $this->xiezi();
  107. $this->OutImg();
  108. }
  109. public function getCodeStr(){
  110. return $this->codestr;
  111. }
  112. }
  113. ?>