Итоги — Кастомная коллекция
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 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) - Клонируйте коллекцию, затем удалите входной ключ из клона с помощью 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"
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy