format('dmy'); switch ((int)($birthdate->format('Y')/100)) { case 18: $centurySign = '+'; break; case 19: $centurySign = '-'; break; case 20: $centurySign = 'A'; break; default: throw new \InvalidArgumentException('Year must be between 1800 and 2099 inclusive.'); } $randomDigits = self::numberBetween(0, 89); if ($gender && $gender == static::GENDER_MALE) { if ($randomDigits === 0) { $randomDigits .= static::randomElement(array(3,5,7,9)); } else { $randomDigits .= static::randomElement(array(1,3,5,7,9)); } } elseif ($gender && $gender == static::GENDER_FEMALE) { if ($randomDigits === 0) { $randomDigits .= static::randomElement(array(2,4,6,8)); } else { $randomDigits .= static::randomElement(array(0,2,4,6,8)); } } else { if ($randomDigits === 0) { $randomDigits .= self::numberBetween(2, 9); } else { $randomDigits .= (string)static::numerify('#'); } } $randomDigits = str_pad($randomDigits, 3, '0', STR_PAD_LEFT); $checksum = $checksumCharacters[(int)($datePart . $randomDigits) % strlen($checksumCharacters)]; return $datePart . $centurySign . $randomDigits . $checksum; } }