Menu
CoddyTech

回顾:自定义集合

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

challenge icon

挑战

简单

让我们构建一个 Collection 类,将你在本章学过的所有魔术方法结合起来。这个集合将作为灵活的数据容器,使用起来十分自然:按键存储项目、检查项目是否存在、动态查找项目,以及创建独立副本。

你要把代码放在两个文件中:

  • Collection.php:创建一个 Collection 类,用私有数组存储项目。你的集合应支持以下协同工作的魔术方法:
    • __construct():接收一个可选的初始项目数组(默认为空数组)
    • __get($key):返回给定键对应的项目,如果不存在则返回 null
    • __set($key, $value):在给定键处存储值
    • __isset($key):返回集合中是否存在该键
    • __unset($key):移除给定键对应的项目
    • __call($method, $args):处理动态查找方法。调用以 findBy 开头的方法时(例如 findByRole 或 findByStatus),提取字段名(将 "findBy" 后面的部分转换为小写),搜索所有项目,并返回字段值与第一个参数匹配的第一个项目的键。如果找不到匹配项,则返回 null。对于其他任何方法,返回 "Unknown method: [method]"
    • __toString():返回 "Collection([count] items)",其中 count 是项目数量
    • __clone():克隆时,项目数组应是一个全新的副本(而不是对原数组的引用)
  • main.php:引入 Collection 文件。你会收到三个输入:键名、角色值和要搜索的角色。创建一个用户集合,并演示所有魔术方法:
    • 创建一个新的 Collection
    • 使用输入的键添加一个用户,存储一个数组,其中 "name" 的值设为该键,"role" 的值设为输入的角色值
    • 再添加一个键为 "bob" 的用户,存储 ["name" => "Bob", "role" => "editor"]
    • 使用 isset() 打印输入的键是否存在:输出 "exists" 或 "missing"
    • 将搜索角色作为参数调用动态的 findByRole() 方法,并打印结果(这应返回匹配用户的键;如果结果为 null,则不输出任何内容)
    • 使用 echo 打印集合(触发 __toString)
    • 克隆集合,然后从克隆对象中取消设置输入的键
    • 打印输入的键是否存在于原始集合中:输出 "exists" 或 "missing"(它仍应存在,因为克隆对象是独立的)

每项输出都应独占一行。动态查找方法假定集合中的每个项目都是关联数组,包含 "name" 和 "role" 这样的字段。

亲手试试

<?php

require_once 'Collection.php';

// 读取输入
$keyName = trim(fgets(STDIN));
$roleValue = trim(fgets(STDIN));
$searchRole = trim(fgets(STDIN));

// TODO: 创建一个新的 Collection

// TODO: 使用输入的键添加一个用户,存储包含 "name" => key 和 "role" => roleValue 的数组

// TODO: 再添加一个键为 "bob" 的用户,存储 ["name" => "Bob", "role" => "editor"]

// TODO: 使用 isset() 打印输入的键是否存在,输出 "exists" 或 "missing"

// TODO: 以 searchRole 为参数调用 findByRole(),打印结果

// TODO: 使用 echo 打印集合(会触发 __toString)

// TODO: 克隆集合,然后从克隆的集合中删除输入的键

// TODO: 打印输入的键是否存在于原始集合中,输出 "exists" 或 "missing"

?>

面向对象编程中的所有课

自己练习: PHP 在线编译器