Повторение — пользовательская коллекция
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 50 из 91.
Задание
ЛегкоДавайте создадим класс 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"(он по-прежнему должен существовать, поскольку клон независим)
- Create новый
Каждый результат должен выводиться на отдельной строке. 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"
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP