Repaso: colección personalizada
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 50 de 91.
Desafío
FácilConstruyamos una clase Collection que reúna todos los métodos mágicos que has aprendido en este capítulo. Tu colección actuará como un contenedor de datos flexible y resultará natural de usar: almacenará elementos por clave, comprobará si existen, buscará elementos dinámicamente y creará copias independientes.
Organizarás tu código en dos archivos:
Collection.php: Crea una claseCollectionque almacene los elementos en un array privado. Tu colección debe admitir estos métodos mágicos trabajando conjuntamente:__construct(): Acepta un array opcional de elementos iniciales (de forma predeterminada, un array vacío)__get($key): Devuelve el elemento de la clave indicada, onullsi no existe__set($key, $value): Almacena el valor en la clave indicada__isset($key): Devuelve si la clave existe en la colección__unset($key): Elimina el elemento de la clave indicada__call($method, $args): Gestiona los métodos de búsqueda dinámicos. Cuando se llama a un método que comienza porfindBy(comofindByRoleofindByStatus), extrae el nombre del campo (convierte a minúsculas la parte posterior a "findBy"), busca entre todos los elementos y devuelve la clave del primer elemento cuyo campo coincida con el primer argumento. Devuelvenullsi no se encuentra ninguna coincidencia. Para cualquier otro método, devuelve"Unknown method: [method]"__toString(): Devuelve"Collection([count] items)", donde count es el número de elementos__clone(): Al clonar, el array de elementos debe ser una copia nueva (no una referencia al original)
main.php: Incluye el archivo Collection. Recibirás tres entradas: un nombre de clave, un valor de rol y un rol de búsqueda. Crea una colección de usuarios y demuestra todos los métodos mágicos:- Crea una nueva
Collection - Añade un usuario con la clave de entrada, almacenando un array con
"name"establecido en la clave y"role"establecido en el valor de rol de entrada - Añade otro usuario con la clave
"bob", almacenando["name" => "Bob", "role" => "editor"] - Imprime si la clave de entrada existe usando
isset(): muestra"exists"o"missing" - Imprime el resultado de llamar al método dinámico
findByRole()con el rol de búsqueda como argumento (esto debe devolver la clave del usuario coincidente, o nada si es null) - Imprime la colección usando
echo(activa__toString) - Clona la colección y, después, elimina la clave de entrada del clon
- Imprime si la clave de entrada existe en la colección original: muestra
"exists"o"missing"(debería seguir existiendo, ya que el clon es independiente)
- Crea una nueva
Cada salida debe aparecer en su propia línea. El buscador dinámico presupone que cada elemento de tu colección es un array asociativo con campos como "name" y "role".
Pruébalo tú mismo
<?php
require_once 'Collection.php';
// Leer entradas
$keyName = trim(fgets(STDIN));
$roleValue = trim(fgets(STDIN));
$searchRole = trim(fgets(STDIN));
// TODO: Crear una nueva Collection
// TODO: Añadir un usuario con la clave de entrada, almacenando un array con "name" => key y "role" => roleValue
// TODO: Añadir otro usuario con la clave "bob", almacenando ["name" => "Bob", "role" => "editor"]
// TODO: Imprimir si la clave de entrada existe usando isset() - salida "exists" o "missing"
// TODO: Imprimir el resultado de llamar a findByRole() con searchRole como argumento
// TODO: Imprimir la colección usando echo (dispara __toString)
// TODO: Clonar la colección, luego hacer unset de la clave de entrada del clon
// TODO: Imprimir si la clave de entrada existe en la colección ORIGINAL - "exists" o "missing"
?>Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online