Menu
Coddy logo textTech

Récapitulatif - Collection personnalisée

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 50 sur 91.

challenge icon

Défi

Facile

Construisons une classe Collection qui réunit toutes les méthodes magiques que tu as découvertes dans ce chapitre. Ta collection servira de conteneur de données flexible et naturel à utiliser : stocker des éléments par clé, vérifier s’ils existent, rechercher des éléments dynamiquement et créer des copies indépendantes.

Tu organiseras ton code dans deux fichiers :

  • Collection.php : crée une classe Collection qui stocke les éléments dans un tableau privé. Ta collection doit prendre en charge les méthodes magiques suivantes, qui fonctionnent ensemble :
    • __construct() : accepte un tableau facultatif d’éléments initiaux (un tableau vide par défaut)
    • __get($key) : renvoie l’élément correspondant à la clé donnée, ou null s’il n’existe pas
    • __set($key, $value) : stocke la valeur à la clé donnée
    • __isset($key) : renvoie si la clé existe dans la collection
    • __unset($key) : supprime l’élément correspondant à la clé donnée
    • __call($method, $args) : gère les méthodes de recherche dynamiques. Lorsqu’une méthode commençant par findBy est appelée (comme findByRole ou findByStatus), extrais le nom du champ (mets en minuscules la partie située après "findBy"), parcours tous les éléments et renvoie la clé du premier élément dont ce champ correspond au premier argument. Renvoie null si aucune correspondance n’est trouvée. Pour toute autre méthode, renvoie "Unknown method: [method]"
    • __toString() : renvoie "Collection([count] items)", où count correspond au nombre d’éléments
    • __clone() : lors du clonage, le tableau d’éléments doit être une copie indépendante (et non une référence vers l’original)
  • main.php : inclus le fichier Collection. Tu recevras trois entrées : un nom de clé, une valeur de rôle et un rôle à rechercher. Construis une collection d’utilisateurs et démontre toutes les méthodes magiques :
    • Crée une nouvelle Collection
    • Ajoute un utilisateur avec la clé fournie en entrée, en stockant un tableau avec "name" défini sur la clé et "role" défini sur la valeur de rôle fournie en entrée
    • Ajoute un autre utilisateur avec la clé "bob", en stockant ["name" => "Bob", "role" => "editor"]
    • Affiche si la clé fournie en entrée existe à l’aide de isset() : affiche "exists" ou "missing"
    • Affiche le résultat de l’appel de la méthode dynamique findByRole() avec le rôle à rechercher comme argument (cela doit renvoyer la clé de l’utilisateur correspondant, ou rien si le résultat est null)
    • Affiche la collection avec echo (ce qui déclenche __toString)
    • Clone la collection, puis supprime la clé fournie en entrée du clone
    • Affiche si la clé fournie en entrée existe dans la collection originale : affiche "exists" ou "missing" (elle doit toujours exister puisque le clone est indépendant)

Chaque sortie doit se trouver sur sa propre ligne. La recherche dynamique suppose que chaque élément de ta collection est un tableau associatif contenant des champs comme "name" et "role".

Essayez vous-même

<?php

require_once 'Collection.php';

// Lire les entrées
$keyName = trim(fgets(STDIN));
$roleValue = trim(fgets(STDIN));
$searchRole = trim(fgets(STDIN));

// TODO: Créer une nouvelle Collection

// TODO: Ajouter un utilisateur avec la clé d'entrée, stockant un tableau avec "name" => key et "role" => roleValue

// TODO: Ajouter un autre utilisateur avec la clé "bob", stockant ["name" => "Bob", "role" => "editor"]

// TODO: Afficher si la clé d'entrée existe en utilisant isset() - afficher "exists" ou "missing"

// TODO: Afficher le résultat de l'appel à findByRole() avec searchRole comme argument

// TODO: Afficher la collection en utilisant echo (déclenche __toString)

// TODO: Cloner la collection, puis unset la clé d'entrée du clone

// TODO: Afficher si la clé d'entrée existe dans la collection ORIGINALE - "exists" ou "missing"

?>

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur PHP en ligne