在网上找的资料, 但是国内没一个说这个的…-__-
所以, 注释我就给写的很详细…
其中, 最重要的就是 _createValidCode 这个私有方法.
他负责生成最后的那一位验证数字…
也就是说, 整个类, 这么多的代码, 就是为了那一个数字…
另外, 我打包的那个jQuery Lightbox插件被WordpressChina.ORG收录了. 很好很强大. 心里蛮开心, 嘿嘿…
* 类名: krIdCreator
* 描述: 韩国身份证编号生成器
* 功能: 生成标准的、可以通过算法校验的韩国人身份证编号
********************************************
* 使用方法:
* void krIdCreator([int $sex_given[, int $rand_given[, int $year_given[, int $month_given[, int $date_given]]]]])
* 目的: 实例化韩国身份证生成器类
* 参数说明:
* $sex_given (可选) 整数或字符串
* 指定所生成的身份证号的 性别部分
* $rand_given (可选) 整数或字符串
* 指定所生成的身份证号的 随机数部分
* $year_given (可选) 整数或字符串
* 制定所生成的身份证号的 年份部分
* $month_given (可选) 整数或字符串
* 制定所生成的身份证号的 月份部分
* $date_given (可选) 整数或字符串
* 制定所生成的身份证号的 日期部分
*
*
* string krIdCreator->krId()
* 目的: 生成可以通过算法校验的韩国身份证编号
* 参数说明:
* 无
********************************************
* 使用举例 - 1 :
* //实例化生成器这个类:
* $krIdCreator = new krIdCreator();
* //使用echo输出生成的身份证号:
* echo $krIdCreator->krId();
*
* 使用举例 - 2 :
* //我想要生于98年的韩国男孩子的身份证编号:
* $krIdCreator = new krIdCreator(’1′, ”, ‘98′);
* //使用echo输出生成的身份证号:
* echo $krIdCreator->krId();
*/
class krIdCreator{
private $_year, $_month, $_date, $_sex, $_rand;
private $_addons = array( 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5 );
private $_maxDays = array( 1 => 31, 2 => 28, 3 => 31, 4 => 30, 5 => 31, 6 => 30, 7 => 31, 8 => 31, 9 => 30, 10 => 31, 11 => 30, 12 => 31 );
/********************************************************************
* 构造函数, 由此类生成实例时, 首先执行这个函数中的程序
*
* @param 整数(可选) $sex_given
* @param 整数(可选) $rand_given
* @param 整数(可选) $year_given
* @param 整数(可选) $month_given
* @param 整数(可选) $date_given
* @return 类 krIdCreator 的实例
********************************************************************/
function krIdCreator( $sex_given = null, $rand_given = null, $year_given = null, $month_given = null, $date_given = null ){
/**
* 校验给定的, 用于身份证性别部分的信息
* 1 = 男性; 2 = 女性;
* 如果没有指出, 则随机从1,2中选出一个
* 如果已经指出, 则取其加1的结果除以2的余数, 之后对这个余数加1
*/
if ( $sex_given == null){
$this->_sex = mt_rand(1, 2);
}
else{
$this->_sex = ( ((int)$sex_given + 1) % 2 ) + 1;
}
/**
* 校验给定的, 用于身份证的5位随机数部分
* 如果没有指出, 则自动生成一个5位的随机数
* 如果已经指出, 则对其进行5位取舍
* 也就是, 不足5位的在前面用数字0补齐.
*/
if ( $rand_given == null){
$this->_rand = sprintf(’%05.05s’, mt_rand( 0, 99999));
}
else{
$this->_rand = sprintf(’%05.05s’, (int)$rand_given);
}
/**
* 校验给定的年份
* 如果没有指出, 则自动生成一个2位的随机数
* 如果已经指出, 则对其进行2位取舍
* 也就是, 不足2位的在前面用数字0补齐
*/
if ( $year_given == null){
$this->_year = sprintf(’%02.02s’, mt_rand( 1, 99));
}
else{
$this->_year = sprintf(’%02.02s’, (int)$year_given);
}
/**
* 校验给定的月份
* 如果没有指出, 则自动生成一个2位的随机数
* 如果已经指出, 则对其进行2位取舍
* 也就是, 不足2位的在前面用数字0补齐
*/
if ( $month_given == null || $month_given > 12 ){
$this->_month = sprintf(’%02.02s’, mt_rand( 1, 12));
}
else{
$this->_month = sprintf(’%02.02s’, (int)$month_given);
}
/**
* 校验给定的日期
* 如果没有指出, 则自动随机生成一个2位的符合常识的日期
* 如果已经指出, 则对其进行2位取舍
* 如果已经给定的日期不符合常识性规则, 则自动生成一个随机数
* 生成当月最大日期函数: _createDate()
*/
if ( $date_given == null || $date_given > $this->_createDate() ){
$this->_date = sprintf(’%02.02s’, mt_rand( 1, $this->_createDate()));
}
else{
$this->_date = sprintf(’%02.02s’, (int)$date_given);
}
}
/********************************************************************
* 生成”yymmdd-sxxxxxv”格式, 并且可以通过算法校验的韩国身份证编号
*
* @return 韩国身份证号
********************************************************************/
function krId(){
$perNo = $this->_year . $this->_month . $this->_date . ‘-’ . $this->_sex . $this->_rand . $this->_createValidCode();
return $perNo;
}
/********************************************************************
* 私有方法
* 用来根据现有的生日性别及随机数, 生成身份证末位的验证数字
*
* @return 验证数字
********************************************************************/
private function _createValidCode(){
$temp = $total = ”;
$mixNumber = $this->_year . $this->_month . $this->_date . $this->_sex . $this->_rand;
for($i=0 ; $i < 12; $i++){
$temp = (int)$mixNumber{$i} * (int)$this->_addons[$i] ;
$total += $temp;
}
$ValidCode = (int)( 11 - ( $total % 11 ) ) % 10;
return $ValidCode;
}
/********************************************************************
* 私有方法
* 使用在用来随机生成生日的地方
* 保证出生日期的常识性, 不会出现出生于 1995年2月31日的情况
*
* @return 当前月份的最大日期
********************************************************************/
private function _createDate(){
$maxDays = $this->_maxDays[(int)$this->_month];
if ( (($this->_year % 4) == 0) && ((int)$this->_month == 2) ){
$maxDays += 1;
}
return $maxDays;
}
}
?>