Menu
Coddy logo textTech

Итоги — Кастомная коллекция

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 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)
    • Клонируйте коллекцию, затем удалите входной ключ из клона с помощью unset
    • Выведите, существует ли входной ключ в оригинальной коллекции — выведите "exists" или "missing" (он все еще должен существовать, так как клон независим)

Каждый вывод должен быть на новой строке. Динамический поиск предполагает, что каждый элемент в вашей коллекции является ассоциативным массивом с такими полями, как "name" и "role".

Попробуйте сами

<?php

require_once 'Collection.php';

// Чтение входных данных
$keyName = trim(fgets(STDIN));
$roleValue = trim(fgets(STDIN));
$searchRole = trim(fgets(STDIN));

// TODO: Создать новую коллекцию

// TODO: Добавить пользователя с входным ключом, сохраняя массив с "name" => key и "role" => roleValue

// TODO: Добавить другого пользователя с ключом "bob", сохраняя ["name" => "Bob", "role" => "editor"]

// TODO: Вывести, существует ли входной ключ, используя isset() - вывод "exists" или "missing"

// TODO: Вывести результат вызова findByRole() с searchRole в качестве аргумента

// TODO: Вывести коллекцию с помощью echo (вызывает __toString)

// TODO: Клонировать коллекцию, затем удалить входной ключ из клона

// TODO: Вывести, существует ли входной ключ в ОРИГИНАЛЬНОЙ коллекции - "exists" или "missing"

?>

Все уроки раздела Объектно-ориентированное программирование