php驗證碼類

class Verify

{

//寬度

protected $width;

//高度

protected $height;

//類型

protected $type;

//長度

protected $length = 4;

//驗證碼

protected $code;

//圖片資源

protected $image;

public static function yzm($width=100,$height=40,$length=4,$type=0)

{

$v = new Verify($width,$height,$length,$type);

$v->output();

return $v->getLastCode();

}

public function __get($propertyName)

{

if ($propertyName == 'code') {

return $this->code;

}

return false;

}

public function getLastCode()

{

return $this->code;

}

public function __construct($width=200,$height=50,$length=4,$type=0)

{

$this->width = $width;

$this->height = $height;

if ($length >= 3 || $length <= 10) {

$this->length = $length;

}

$this->type = $type;

}

public function output()

{

$this->createImage();

$this->setVerifyCode();

$this->setDisturb();

$this->sendImage();

}

//創(chuàng)建畫布并設置淺色背景

protected function createImage()

{

$this->image = imagecreatetruecolor($this->width, $this->height);

$lightColor = $this->getColor(true);

imagefill($this->image, 0, 0, $lightColor);

}

protected function setVerifyCode()

{

//產(chǎn)生驗證碼字符串

$this->code = $this->randString();

//將驗證碼畫到畫布上

$fontSize = $this->height / 2;

$perWidth = $this->width / $this->length;

$delta = ($perWidth - $fontSize) / 2;

$offsetY = ($this->height + $fontSize) / 2;

for ($i=0; $i < $this->length; $i++) {

//提取一個字符

$ch = mb_substr($this->code, $i, 1);

$color = $this->getColor();

$angle = mt_rand(-30,30);

$offsetX = $i * $perWidth + $delta;

//畫到畫布上

imagettftext($this->image, $fontSize, $angle, $offsetX, $offsetY, $color, '../../../../public/fonts/lxkmht.ttf', $ch);

}

}

protected function setDisturb()

{

$total = $this->width * $this->height / 50;

for ($i=0; $i < $total; $i++) {

$x = mt_rand(0, $this->width-1);

$y = mt_rand(0, $this->height-1);

$color = $this->getColor();

imagesetpixel($this->image, $x, $y, $color);

}

}

protected function sendImage()

{

header('Content-Type:image/png');

imagepng($this->image);

imagedestroy($this->image);

}

protected function getColor($isLight=false)

{

$start = (int)$isLight * 128;

$end = $start + 127;

$red = mt_rand($start,$end);

$green = mt_rand($start,$end);

$blue = mt_rand($start,$end);

return imagecolorallocate($this->image, $red, $green, $blue);

}

protected function randString()

{

switch ($this->type) {

case 0://純數(shù)字

$str = $this->randNumber();

break;

case 1://純字母

$str = $this->randAlpha();

break;

case 2://數(shù)字字母混合

$str = $this->randMixed();

break;

case 3://中文

$str = $this->randChinese();

break;

default://未知

$str = $this->randUnknow();

break;

}

return $str;

}

protected function randNumber()

{

$str = '1234567890';

return substr(str_shuffle($str), 0, $this->length);

}

protected function randAlpha()

{

$arr = range('a', 'z');

$str = join('', $arr);

$str .= strtoupper($str);

return substr(str_shuffle($str), 0, $this->length);

}

protected function randMixed()

{

$str = '';

for ($i=0; $i < $this->length; $i++) {

$type = mt_rand(0, 2);

switch ($type) {

case 0://數(shù)字

$str .= chr(mt_rand(ord('0'), ord('9')));

break;

case 1://小寫字母

$str .= chr(mt_rand(ord('a'), ord('z')));

break;

case 2://大寫字母

$str .= chr(mt_rand(ord('A'), ord('Z')));

break;

}

}

return $str;

}

protected function randChinese()

{

$str = '';

for ($i=0; $i < $this->length; $i++) {

$ch1 = mt_rand(176,214);

$ch2 = mt_rand(161,254);

$str .= chr($ch1) . chr($ch2);

}

return iconv('gbk', 'utf-8', $str);

}

protected function randUnknow()

{

$ch = rand(0,9);

$arr = array_fill(0, $this->length, $ch);

return join('', $arr);

}

}

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處?;ヂ?lián)網(wǎng)+時代,時刻要保持學習,攜手千鋒PHP,Dream?It?Possible。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內(nèi)容

  • class Verify { //寬度 protected $width; //高度 protected $hei...
    斯文小螞蟻閱讀 233評論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,759評論 0 33
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,477評論 0 17
  • 背景 驗證碼就是把一串隨機產(chǎn)品的數(shù)字動態(tài)生成一幅圖片,再加上干擾元素。此時用戶可以通過肉眼能識別里面的數(shù)字或者字符...
    dy2903閱讀 2,109評論 0 7
  • 人生只有一瞬間,而那一瞬間,卻讓我眺望良久。 一本唐詩,說不盡這韻味。一部宋詞,唱不完這柔美。 有一刻,閃現(xiàn)那塵封...
    鏡畫者閱讀 276評論 0 1