getNextId(); $post = new Post( id: $id, userId: $dto->userId, title: $dto->title, body: $dto->body, createdAt: $dto->createdAt, ); $this->existingPosts[$id] = $post; return $post; } public function find(int $id): ?Post { $post = $this->existingPosts[$id] ?? null; if ($post === null) { return null; } return $this->copy($post); } /** * @return Post[] */ public function findByUserId(int $userId): array { $matching = []; foreach ($this->existingPosts as $post) { if ($post->getUserId() === $userId) { $matching[] = $this->copy($post); } } usort( $matching, function (Post $left, Post $right) { return $right->getCreatedAt() <=> $left->getCreatedAt(); }, ); return $matching; } /** * @return Post[] */ public function findRecent(int $limit): array { $all = array_map( function (Post $post) { return $this->copy($post); }, array_values($this->existingPosts), ); usort( $all, function (Post $left, Post $right) { return $right->getCreatedAt() <=> $left->getCreatedAt(); }, ); return array_slice($all, 0, $limit); } public function delete(int $id): void { unset($this->existingPosts[$id]); } private function copy(Post $post): Post { return new Post( id: $post->getId(), userId: $post->getUserId(), title: $post->getTitle(), body: $post->getBody(), createdAt: $post->getCreatedAt(), ); } private function getNextId(): int { return count($this->existingPosts) + 1; } }