管理员界面
本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 86 课,共 91 课。
挑战
简单让我们通过添加管理功能来扩展图书馆管理系统。你将创建一个继承自 User 的 Admin 类,它拥有管理图书馆藏书的特殊权限:添加新书和移除现有图书。
你将把代码分布在 5 个文件中:
Book.php:包含你的Book类,其中有只读属性(isbn、title、author)、初始值为true的私有属性$isAvailable,以及以下方法:isAvailable()、markAsBorrowed()和markAsReturned()。User.php:引入 Book 文件。你的User类包含只读属性(id、name)、私有数组$borrowedBooks、值为3的MAX_BOOKS常量,以及以下方法:getBorrowedBooks()、canBorrow()、addBook(Book $book)和removeBook(string $isbn)。Library.php:引入 User 文件。你的Library类包含现有功能,包括addBook()、findBook()、borrowBook()、returnBook()和搜索方法。添加一个新方法:removeBook(string $isbn): void:使用unset()从藏书集合中移除一本书。
Admin.php:引入 Library 文件。创建一个继承自User的Admin类。管理员继承用户的所有功能,并额外获得两个管理方法: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 和一个书名。创建一个
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. 让管理员再次尝试移除同一本书(应该失败,因为找不到这本书)
?>面向对象编程中的所有课
自己练习: PHP 在线编译器