Menu
Coddy logo textTech

Resumen - Colección personalizada

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 50 de 91.

challenge icon

Desafío

Fácil

Vamos a construir 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 que se siente natural al usarlo: almacenando elementos por clave, comprobando si existen, encontrando elementos dinámicamente y creando copias independientes.

Organizarás tu código en dos archivos:

  • Collection.php — Crea una clase Collection que almacene elementos en un array privado. Tu colección debe admitir estos métodos mágicos trabajando juntos:
    • __construct() — Acepta un array opcional de elementos iniciales (por defecto un array vacío)
    • __get($key) — Devuelve el elemento en la clave dada, o null si no existe
    • __set($key, $value) — Almacena el valor en la clave dada
    • __isset($key) — Devuelve si la clave existe en la colección
    • __unset($key) — Elimina el elemento en la clave dada
    • __call($method, $args) — Maneja métodos de búsqueda dinámicos. Cuando se llama a un método que comienza con findBy (como findByRole o findByStatus), extrae el nombre del campo (convierte a minúsculas la parte después de "findBy"), busca a través de todos los elementos y devuelve la clave del primer elemento donde ese campo coincida con el primer argumento. Devuelve null si 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() — Cuando se clona, 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. Construye una colección de usuarios y demuestra todos los métodos mágicos:
    • Crea una nueva Collection
    • Agrega 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
    • Agrega otro usuario con la clave "bob", almacenando ["name" => "Bob", "role" => "editor"]
    • Imprime si la clave de entrada existe usando isset() — salida "exists" o "missing"
    • Imprime el resultado de llamar al método dinámico findByRole() con el rol de búsqueda como argumento (esto debería devolver la clave del usuario coincidente, o nada si es null)
    • Imprime la colección usando echo (activa __toString)
    • Clona la colección, luego elimina la clave de entrada del clon usando unset
    • Imprime si la clave de entrada existe en la colección original — salida "exists" o "missing" (debería seguir existiendo ya que el clon es independiente)

Cada salida debe estar en su propia línea. El buscador dinámico asume que cada elemento en 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: Agregar un usuario con la clave de entrada, almacenando el array con "name" => key y "role" => roleValue

// TODO: Agregar 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 (activa __toString)

// TODO: Clonar la colección, luego eliminar la clave de entrada del clon usando unset

// 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