BookクラスとUserクラス
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 83/91。
チャレンジ
簡単BookクラスとUserクラスを作成して、図書館管理システムの基礎を構築しましょう。これらのコアとなるドメインオブジェクトは、連携して図書館の運営を管理します。
コードは3つのファイルに分けて構成します:
Book.php— 図書館の蔵書を追跡するBookクラスを作成します。このクラスには、コンストラクタのプロモーション(constructor promotion)を介して設定される3つの読み取り専用(readonly)プロパティisbn、title、authorを持たせてください。また、初期値が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): void—array_filterを使用して、ISBNで指定された本を削除します
main.php— Userファイルをインクルードし、クラスを実際に動かします。ユーザーID、ユーザー名、本のISBN、本のタイトルの4つの入力を受け取ります(著者は"Unknown"とします)。提供された値を使用して
UserとBookを作成します。最初にユーザーが本を借りられるかどうかを出力し、次にユーザーに本を借りさせます(本を貸出中にマークし、ユーザーのリストに追加します)。最後に、本の利用可能状況と借りている本の数を出力します。出力形式:
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]"
?>