A high-performance PHP package for validating, parsing, and generating Indonesian identity numbers (NIK and KK) with PHP 8.4 features and optimized performance.
- NIK (Nomor Induk Kependudukan) validation and parsing
- KK (Kartu Keluarga) validation and parsing
- PHP 8.4 optimized with modern features
- High Performance with intelligent caching
- Offline Operation - no internet connection required
- Comprehensive Data - age, gender, address, postal code
- Type Safety with strict type declarations
- Error Handling with detailed validation messages
- Random Generation for testing and development
composer require korfra/identika<?php
use Korfra\Identika\NIK;
$nik = NIK::set('3273012501990001');
$result = $nik->parse();
if ($result->valid) {
echo "Gender: " . $result->gender . "\n";
echo "Born: " . $result->born->full . "\n";
echo "Age: " . $result->age->year . " years\n";
echo "Province: " . $result->address->province . "\n";
echo "City: " . $result->address->city . "\n";
echo "Sub-district: " . $result->address->subDistrict . "\n";
echo "Postal Code: " . $result->postalCode . "\n";
echo "Unique Code: " . $result->uniqueCode . "\n";
}<?php
use Korfra\Identika\KK;
$kk = KK::set('3273012501990001');
$result = $kk->parse();
if ($result->valid) {
echo "Formatted: " . $kk->getFormattedNumber() . "\n";
echo "Province: " . $result->address->province . "\n";
echo "City: " . $result->address->city . "\n";
echo "Sub-district: " . $result->address->subDistrict . "\n";
echo "Postal Code: " . $result->postalCode . "\n";
}<?php
use Korfra\Identika\NIK;
try {
$nik = NIK::set('123456789012345'); // Too short
} catch (\InvalidArgumentException $e) {
echo "Error: " . $e->getMessage() . "\n";
}
// Get detailed validation errors
$nik = NIK::set('1234567890123456'); // Valid format but invalid data
$errors = $nik->getValidationErrors();
print_r($errors);<?php
use Korfra\Identika\NIK;
$nik = NIK::set('3273012501990001');
$array = $nik->toArray();
echo json_encode($array, JSON_PRETTY_PRINT);<?php
use Korfra\Identika\NIK;
use Korfra\Identika\KK;
// Generate random NIK
$nik = NIK::generate(); // Returns valid NIK string
// Generate NIK with specific location, gender and birth date
$nik = NIK::generate(
province: '32', // Jawa Barat
city: '3273', // Kota Bandung
subDistrict: '327301', // Sukasari
gender: 'PEREMPUAN',
birthDate: '170845' // 17 August 1945
);
// Generate random KK
$kk = KK::generate(); // Returns valid KK string
// Generate KK for specific location
$kk = KK::generate(province: '31'); // DKI Jakarta<?php
use Korfra\Identika\NIK;
// Both string and integer inputs work
$nik1 = NIK::set('3273012501990001'); // string
$nik2 = NIK::set(3273012501990001); // integer- Intelligent caching for frequently accessed data
- 13.8x faster performance on cached vs non-cached calls
- Memory-efficient caching strategy
- Direct character access instead of
substr() - 2.6x faster string operations
- Readonly properties for immutability
- Efficient object lifecycle management
- Static caching for current year calculation
- Readonly Properties:
public readonly string $number - Constructor Property Promotion: Simplified constructors
- Union Types:
string|intfor flexible input - Null Coalescing Assignment:
??=operator - Improved Type Declarations: Better type safety
- Early Returns: Optimized control flow
| Operation | Time | Memory |
|---|---|---|
| NIK Creation | ~1.1ms | ~785KB |
| NIK Parsing | ~0.03ms | ~69KB |
| KK Creation | ~0.1ms | ~16KB |
| KK Parsing | <0.01ms | ~1KB |
| NIK Generation | ~0.05ms | ~48B |
| KK Generation | ~0.01ms | ~48B |
| 1000 NIK Operations | ~3.1ms | Optimized |
| 1000 KK Operations | ~1.3ms | Optimized |
Run the comprehensive test suite:
composer testAll 63 tests pass with 100% coverage.
identika/
βββ src/
β βββ Base.php # Abstract base class with optimizations
β βββ NIK.php # NIK validator with caching
β βββ KK.php # KK validator with formatting
β βββ assets/
β βββ wilayah.json # Location data
βββ tests/
β βββ BaseTest.php # Base class tests
β βββ NIKTest.php # NIK validation tests
β βββ KKTest.php # KK validation tests
β βββ TestCase.php # Test base class
βββ example.php # Performance demonstration
βββ composer.json # Dependencies
set(string|int $number): self- Create NIK instancegenerate(?string $province = null, ?string $city = null, ?string $subDistrict = null, ?string $gender = null, ?string $birthDate = null): string- Generate random valid NIKparse(): object- Parse and validate NIK datavalidate(): bool- Check if NIK is validgetValidationErrors(): array- Get detailed error messagestoArray(): array- Get data as arraygetGender(): string- Get gender (LAKI-LAKI/PEREMPUAN)getBornDate(): object- Get birth date informationgetAge(): object- Get age calculationgetProvince(): ?string- Get province namegetCity(): ?string- Get city namegetSubDistrict(): ?string- Get sub-district namegetPostalCode(): ?string- Get postal code
set(string|int $number): self- Create KK instancegenerate(?string $province = null, ?string $city = null, ?string $subDistrict = null): string- Generate random valid KK numberparse(): object- Parse and validate KK datavalidate(): bool- Check if KK is validgetValidationErrors(): array- Get detailed error messagestoArray(): array- Get data as arraygetFormattedNumber(): string- Get formatted KK numbergetRawNumber(): string- Get raw KK numbergetProvince(): ?string- Get province namegetCity(): ?string- Get city namegetSubDistrict(): ?string- Get sub-district namegetPostalCode(): ?string- Get postal code
- Reuse Instances: Create validator once and reuse for multiple operations
- Caching Benefits: Subsequent calls to
getBornDate(),getAge(), etc. are cached - Type Safety: Use union types for flexible input handling
- Error Handling: Always check
$result->validbefore accessing data
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Ensure all tests pass
- Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.
- Indonesian government for the NIK and KK number format specifications
- PHP community for the excellent 8.4 features
- All contributors who helped optimize this package
Built with β€οΈ and optimized for PHP 8.4+