existingUsers, function (User $user) use ($id) { return $user->getId() === $id; } ); if ($user === null) { return null; } return new User( id: $user->getId(), email: $user->getEmail(), passwordHash: $user->getPasswordHash(), isAdmin: $user->isAdmin(), ); } public function findByEmail(EmailAddress $email): ?User { $user = array_find( $this->existingUsers, function (User $user) use ($email) { return (string) $user->getEmail() === (string) $email; } ); if ($user === null) { return null; } return new User( id: $user->getId(), email: $user->getEmail(), passwordHash: $user->getPasswordHash(), isAdmin: $user->isAdmin(), ); } public function create(CreateUserDto $dto): User { $id = $this->nextId(); $user = new User( id: $id, email: $dto->email, passwordHash: $dto->passwordHash, isAdmin: $dto->isAdmin, ); $this->existingUsers[$id] = $user; return $user; } private function nextId(): int { return count($this->existingUsers); } }