Menu
CoddyTech

借阅系统

本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 84 课,共 91 课。

challenge icon

挑战

简单

通过创建负责协调所有借阅操作的 Library 类,让图书管理系统真正运转起来。这个中央协调器将管理藏书,并执行相关规则,确保图书馆顺畅运行。

你要将代码分别放在以下四个文件中:

  • 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 类。你的图书馆应包含:
    • 一个私有 $books 数组,用于按 ISBN 索引存储图书
    • addBook(Book $book): void:将图书添加到藏书中
    • findBook(string $isbn): ?Book:返回图书;如果未找到,则返回 null
    • borrowBook(User $user, string $isbn): string:验证并处理借阅,返回相应的消息
    • returnBook(User $user, string $isbn): string:处理归还,并更新图书和用户的状态

    borrowBook 方法应按顺序检查三个条件,并返回以下确切消息:

    • "Book not found":如果图书不存在
    • "Book is not available":如果图书已被借出
    • "Borrowing limit reached":如果用户已有 3 本图书
    • "Successfully borrowed: [title]":借阅成功时

    如果图书不存在,returnBook 方法应返回 "Book not found";如果归还成功,则返回 "Successfully returned: [title]"。

  • main.php:引入 Library 文件。你将收到两个输入:一个 ISBN 和一个图书标题。

    创建一个 Library、一个 ID 为 1 且名称为 "Alice" 的 User,以及一本使用提供的 ISBN、标题和作者 "Unknown" 创建的 Book。将图书添加到图书馆,然后执行以下操作,并将每个结果打印在新的一行:

    1. 借阅这本书
    2. 再次尝试借阅同一本书
    3. 归还这本书
    4. 再借阅一次这本书

这个挑战展示了 Library 类如何集中处理业务逻辑。它会验证条件,协调 Book 和 User 对象之间的状态变化,并为每项操作返回有意义的反馈。

亲手试试

<?php
require_once 'Library.php';

// 读取输入
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));

// TODO:创建一个 Library 实例

// TODO:创建一个 ID 为 1、名字为 "Alice" 的 User

// TODO:用提供的 ISBN、title 和作者 "Unknown" 创建一个 Book

// TODO:将这本书添加到库中

// TODO:执行以下操作,并将每个结果打印在新的一行:
// 1. 借阅这本书
// 2. 再次尝试借阅同一本书
// 3. 归还这本书
// 4. 再借阅一次这本书

?>

面向对象编程中的所有课

自己练习: PHP 在线编译器