Ulid
ULID (Universally Unique Lexicographically Sortable Identifier) を扱う値オブジェクトです。
名前空間
php
WizDevelop\PhpValueObject\String\Ulid継承関係
StringValueBase
└── Ulid実装インターフェース
IValueObjectStringableJsonSerializableIStringValueFactory
ULID の特徴
- 26 文字の固定長
- タイムスタンプ (10 文字) + ランダム (16 文字)
- 辞書順でソート可能
- Crockford's Base32 エンコーディング
プロパティ
value
php
public readonly string $valueULID 文字列を保持します。例: 01H34J1XAQX0VBW6G6ZK22HC1K
ファクトリメソッド
from
php
public static function from(string $value): staticULID 文字列からインスタンスを作成します。
php
$ulid = Ulid::from("01H34J1XAQX0VBW6G6ZK22HC1K");tryFrom
php
public static function tryFrom(string $value): Result<static, ValueObjectError>検証付きでインスタンスを作成します。
php
$result = Ulid::tryFrom("01H34J1XAQX0VBW6G6ZK22HC1K");
if ($result->isOk()) {
$ulid = $result->unwrap();
}generate
php
public static function generate(): static新しい ULID を生成します。タイムスタンプは現在時刻、ランダム部分は暗号的に安全な乱数で生成されます。
php
$ulid = Ulid::generate();generateWithTimestamp
php
public static function generateWithTimestamp(int $timestamp): static指定されたタイムスタンプ (ミリ秒) で ULID を生成します。
php
$timestamp = strtotime('2024-01-01 00:00:00') * 1000;
$ulid = Ulid::generateWithTimestamp($timestamp);generateMonotonic
php
public static function generateMonotonic(int $timestamp, ?string $previousRandomBits = null): static単調増加する ULID を生成します。同じミリ秒内で生成された ULID が順序付けられることを保証します。
php
$timestamp = time() * 1000;
$previousRandom = null;
$ulid1 = Ulid::generateMonotonic($timestamp, $previousRandom);
$previousRandom = $ulid1->getRandomBits();
$ulid2 = Ulid::generateMonotonic($timestamp, $previousRandom);
// $ulid2 > $ulid1 (同じタイムスタンプでも単調増加)インスタンスメソッド
getTimestamp
php
public function getTimestamp(): intULID からタイムスタンプを抽出します (ミリ秒単位)。
php
$ulid = Ulid::from("01H34J1XAQX0VBW6G6ZK22HC1K");
$timestamp = $ulid->getTimestamp(); // ミリ秒getDateTime
php
public function getDateTime(): DateTimeImmutableタイムスタンプを DateTimeImmutable に変換します。
php
$ulid = Ulid::from("01H34J1XAQX0VBW6G6ZK22HC1K");
$dateTime = $ulid->getDateTime();
echo $dateTime->format('Y-m-d H:i:s');getRandomBits
php
public function getRandomBits(): stringULID のランダム部分 (16 文字) を取得します。generateMonotonic で使用します。
php
$ulid = Ulid::from("01H34J1XAQX0VBW6G6ZK22HC1K");
$randomBits = $ulid->getRandomBits(); // 16文字equals
php
public function equals(IValueObject $other): bool他の ULID と等価かどうかを判定します。
__toString
php
public function __toString(): string文字列に変換します。
jsonSerialize
php
public function jsonSerialize(): stringJSON シリアライズ時に文字列として出力します。
バリデーション
以下の条件を満たす場合に有効な ULID です。
- 26 文字の固定長
- Crockford's Base32 文字 (0-9, A-Z、ただし I, L, O, U を除く)
php
// 有効
Ulid::tryFrom("01H34J1XAQX0VBW6G6ZK22HC1K")->isOk(); // true
// 無効
Ulid::tryFrom("invalid")->isErr(); // true (文字数不足)
Ulid::tryFrom("00000000000000000000000000")->isOk(); // true (すべて0でも有効)使用例
ID として使用
php
final readonly class UserId extends Ulid
{
}
$userId = UserId::generate();
echo $userId; // "01H34J1XAQX0VBW6G6ZK22HC1K"生成日時の取得
php
$ulid = Ulid::from("01H34J1XAQX0VBW6G6ZK22HC1K");
$createdAt = $ulid->getDateTime();
echo $createdAt->format('Y-m-d H:i:s.u');