A high-performance PHP package for validating and parsing 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, zodiac, address, postal code
- Type Safety with strict type declarations
- Error Handling with detailed validation messages
composer require turahe/number-validator<?php
use Turahe\Validator\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 "Zodiac: " . $result->zodiac . "\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 Turahe\Validator\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 Turahe\Validator\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 Turahe\Validator\NIK;
$nik = NIK::set('3273012501990001');
$array = $nik->toArray();
echo json_encode($array, JSON_PRETTY_PRINT);<?php
use Turahe\Validator\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
- Optimized zodiac calculation with early returns
- 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 | ~2.5ms | ~783KB |
| NIK Parsing | ~0.1ms | ~4KB |
| KK Creation | ~2.1ms | ~739KB |
| KK Parsing | ~0.02ms | ~1KB |
| 1000 NIK Operations | ~1.5s | Optimized |
| 1000 KK Operations | ~1.5s | Optimized |
Run the comprehensive test suite:
./vendor/bin/phpunitAll 63 tests pass with 100% coverage.
number-validator/
βββ 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
βββ example.php # Performance demonstration
βββ composer.json # Dependencies
set(string|int $number): self- Create NIK instanceparse(): 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 calculationgetZodiac(): string- Get zodiac signgetProvince(): ?string- Get province namegetCity(): ?string- Get city namegetSubDistrict(): ?string- Get sub-district namegetPostalCode(): ?string- Get postal code
set(string|int $number): self- Create KK instanceparse(): 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+