Menu
Coddy logo textTech

BookクラスとUserクラス

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 83/91。

challenge icon

チャレンジ

簡単

BookクラスとUserクラスを作成して、図書館管理システムの基礎を構築しましょう。これらのコアとなるドメインオブジェクトは、連携して図書館の運営を管理します。

コードは3つのファイルに分けて構成します:

  • Book.php — 図書館の蔵書を追跡する Book クラスを作成します。このクラスには、コンストラクタのプロモーション(constructor promotion)を介して設定される3つの読み取り専用(readonly)プロパティ isbntitleauthor を持たせてください。また、初期値が true のプライベートな $isAvailable プロパティを含めます。以下の3つのメソッドを追加してください:
    • isAvailable(): bool — 利用可能状況を返します
    • markAsBorrowed(): void — 利用可能状況を false に設定します
    • markAsReturned(): void — 利用可能状況を true に設定します
  • User.php — Bookファイルをインクルードし、図書館の利用者を象徴する User クラスを作成します。このクラスには、コンストラクタのプロモーションを介して2つの読み取り専用プロパティ id (int) と name (string) を持たせてください。また、プライベートな配列 $borrowedBooks(初期状態は空)と、3 に設定された定数 MAX_BOOKS を含めます。以下のメソッドを追加してください:
    • getBorrowedBooks(): array — 借りている本の配列を返します
    • canBorrow(): bool — ユーザーが借りている本が MAX_BOOKS 未満の場合に true を返します
    • addBook(Book $book): void — 借りている本の配列に本を追加します
    • removeBook(string $isbn): voidarray_filter を使用して、ISBNで指定された本を削除します
  • main.php — Userファイルをインクルードし、クラスを実際に動かします。ユーザーID、ユーザー名、本のISBN、本のタイトルの4つの入力を受け取ります(著者は "Unknown" とします)。

    提供された値を使用して UserBook を作成します。最初にユーザーが本を借りられるかどうかを出力し、次にユーザーに本を借りさせます(本を貸出中にマークし、ユーザーのリストに追加します)。最後に、本の利用可能状況と借りている本の数を出力します。

    出力形式:

    Can borrow: [yes/no]
    Book available: [yes/no]
    Books borrowed: [count]

カプセル化によって内部状態がどのように保護されているかに注目してください。本の利用可能状況は専用のメソッドを通じてのみ変更され、ユーザーが借りている本は制御されたアクセスを通じて管理されます。この基礎が、次に構築する貸出システムを支えることになります。

自分で試してみよう

<?php

require_once 'User.php';

// 入力を読み込む
$userId = intval(trim(fgets(STDIN)));
$userName = trim(fgets(STDIN));
$bookIsbn = trim(fgets(STDIN));
$bookTitle = trim(fgets(STDIN));
$bookAuthor = "Unknown";

// TODO: 提供されたIDと名前を使用してUserオブジェクトを作成する

// TODO: 提供されたISBN、タイトル、著者を使用してBookオブジェクトを作成する

// TODO: ユーザーが最初に借りることができるかどうかを出力する
// フォーマット: "Can borrow: yes" または "Can borrow: no"

// TODO: ユーザーに本を借りさせる:
// - 本を貸出中としてマークする
// - ユーザーの借用本リストに本を追加する

// TODO: 本の利用可能性を出力する
// フォーマット: "Book available: yes" または "Book available: no"

// TODO: 借りている本の数を出力する
// フォーマット: "Books borrowed: [count]"

?>

オブジェクト指向プログラミングのすべてのレッスン