回顾:自定义集合
本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 50 课,共 91 课。
挑战
简单让我们构建一个 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 在线编译器