Menu
Coddy logo textTech

Повторение — пользовательская коллекция

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 50 из 91.

challenge icon

Задание

Легко

Давайте создадим класс Collection, который объединяет все магические методы, изученные вами в этой главе. Ваша коллекция будет выступать в роли гибкого контейнера данных, естественного в использовании: хранить элементы по ключу, проверять, существуют ли они, динамически находить элементы и создавать независимые копии.

Вы организуете код в двух файлах:

  • Collection.php: Create класс Collection, который хранит элементы в private array. Ваша коллекция должна поддерживать следующие магические методы, работающие вместе:
    • __construct(): Accepts необязательный array начальных элементов (default — пустой array)
    • __get($key): Возвращает элемент по указанному ключу или null, если он doesn't exist
    • __set($key, $value): Сохраняет значение по указанному ключу
    • __isset($key): Возвращает информацию о том, существует ли ключ в коллекции
    • __unset($key): Удаляет элемент по указанному ключу
    • __call($method, $args): Обрабатывает dynamic методы finder. Когда вызывается метод, начинающийся с findBy (например, findByRole или findByStatus), extract имя field (приведите к нижнему регистру часть после "findBy"), выполните поиск по всем элементам и верните ключ first элемента, у которого это field совпадает с first argument. Верните null, если совпадение не найдено. Для любого другого метода верните "Unknown method: [method]"
    • __toString(): Возвращает "Collection([count] items)", где count — это количество элементов
    • __clone(): При клонировании array элементов должна стать отдельной копией, а не ссылкой на оригинал
  • main.php: Подключите файл Collection. Вы получите три входных значения: имя ключа, значение роли и роль для поиска. Создайте коллекцию пользователей и продемонстрируйте все магические методы:
    • Create новый Collection
    • Add пользователя с входным ключом, сохранив array с "name", установленным в значение ключа, и "role", установленным в значение входной роли
    • Add another пользователя с ключом "bob", сохранив ["name" => "Bob", "role" => "editor"]
    • Выведите, существует ли входной ключ, используя isset(): выведите "exists" или "missing"
    • Выведите результат вызова dynamic метода findByRole(), передав роль для поиска в качестве argument (метод должен вернуть ключ подходящего пользователя или ничего, если результатом является null)
    • Выведите коллекцию с помощью echo (это вызывает __toString)
    • Клонируйте коллекцию, затем удалите входной ключ из клона
    • Выведите, существует ли входной ключ в original коллекции: выведите "exists" или "missing" (он по-прежнему должен существовать, поскольку клон независим)

Каждый результат должен выводиться на отдельной строке. Dynamic finder предполагает, что каждый элемент вашей коллекции является ассоциативным array с такими полями, как "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: Вывести результат вызова findByRole() с searchRole в качестве аргумента

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

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

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

?>

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

Потренируйтесь самостоятельно: Онлайн-компилятор PHP