管理者インターフェース
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 86/91。
チャレンジ
簡単管理機能を追加して、図書館管理システムを拡張しましょう。Userを継承し、図書館の在庫を管理する(新しい本の追加や既存の本の削除)特別な権限を持つAdminクラスを作成します。
コードは5つのファイルに分けて構成します:
Book.php— 読み取り専用プロパティ(isbn、title、author)、初期値がtrueのプライベートな$isAvailableプロパティ、およびメソッド:isAvailable()、markAsBorrowed()、markAsReturned()を持つBookクラスです。User.php— Bookファイルをインクルードします。読み取り専用プロパティ(id、name)、プライベートな$borrowedBooks配列、値が3のMAX_BOOKS定数、およびメソッド:getBorrowedBooks()、canBorrow()、addBook(Book $book)、removeBook(string $isbn)を持つUserクラスです。Library.php— Userファイルをインクルードします。addBook()、findBook()、borrowBook()、returnBook()、および検索メソッドを含む既存の機能を持つLibraryクラスです。新しいメソッドを追加してください:removeBook(string $isbn): void—unset()を使用してコレクションから本を削除します。
Admin.php— Libraryファイルをインクルードします。Userを継承するAdminクラスを作成します。管理者はユーザーのすべての機能を継承しますが、2つの管理用メソッドが追加されます:addBookToLibrary(Library $library, Book $book): string— 図書館に本を追加し、"Added: [title]"を返します。removeBookFromLibrary(Library $library, string $isbn): string— 以下のチェックを行いながら本の削除を試みます:- 本が存在しない場合は、
"Book not found"を返します。 - 本が現在貸出中の場合は、
"Cannot remove: book is currently borrowed"を返します。 - それ以外の場合は、本を削除して
"Removed: [title]"を返します。
- 本が存在しない場合は、
main.php— Adminファイルをインクルードします。ISBNと本のタイトルの2つの入力を受け取ります。Libraryを作成し、IDが1、名前が"AdminUser"のAdminを作成します。また、IDが2、名前が"RegularUser"の通常のUserを作成します。提供されたISBN、タイトル、および著者名
"Test Author"を使用してBookを作成します。以下の操作を実行し、各結果を新しい行に出力してください:- 管理者が本を図書館に追加する
- 一般ユーザーがその本を借りる
- 管理者がその本の削除を試みる(貸出中のため失敗するはずです)
- 一般ユーザーがその本を返却する
- 管理者がその本を削除する(今度は成功するはずです)
- 管理者が同じ本を再度削除しようとする(見つからないため失敗するはずです)
このチャレンジは、継承がいかにして自然な階層構造(管理者は追加の特権を持つユーザーである)を作成するかを示しています。removeBookFromLibraryにおける安全チェックは、流通している本の削除を防ぐことでデータの整合性を保証します。
自分で試してみよう
<?php
require_once 'Admin.php';
// 入力を読み込む
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Library(図書館)を作成する
// TODO: IDが1、名前が "AdminUser" の Admin(管理者)を作成する
// TODO: IDが2、名前が "RegularUser" の一般 User(ユーザー)を作成する
// TODO: 提供されたISBN、タイトル、および著者名 "Test Author" で Book(本)を作成する
// TODO: 以下の操作を実行し、各結果を新しい行に出力する:
// 1. 管理者が本を図書館に追加する
// 2. 一般ユーザーが本を借りる
// 3. 管理者が本の削除を試みる(貸出中のため失敗するはず)
// 4. 一般ユーザーが本を返却する
// 5. 管理者が本を削除する(今度は成功するはず)
// 6. 管理者が同じ本の削除を再度試みる(見つからないため失敗するはず)
?>