Récapitulatif - Collection personnalisée
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 50 sur 91.
Défi
FacileConstruisons une classe Collection qui rassemble toutes les méthodes magiques que vous avez apprises dans ce chapitre. Votre collection agira comme un conteneur de données flexible et naturel à utiliser — stockant des éléments par clé, vérifiant s'ils existent, trouvant des éléments de manière dynamique et créant des copies indépendantes.
Vous organiserez votre code sur deux fichiers :
Collection.php— Créez une classeCollectionqui stocke les éléments dans un tableau privé. Votre collection doit prendre en charge ces méthodes magiques travaillant ensemble :__construct()— Accepte un tableau optionnel d'éléments initiaux (par défaut un tableau vide)__get($key)— Retourne l'élément à la clé donnée, ounulls'il n'existe pas__set($key, $value)— Stocke la valeur à la clé donnée__isset($key)— Retourne si la clé existe dans la collection__unset($key)— Supprime l'élément à la clé donnée__call($method, $args)— Gère les méthodes de recherche dynamiques. Lorsqu'une méthode commençant parfindByest appelée (commefindByRoleoufindByStatus), extrayez le nom du champ (mettez en minuscules la partie après "findBy"), parcourez tous les éléments et retournez la clé du premier élément où ce champ correspond au premier argument. Retourneznullsi aucune correspondance n'est trouvée. Pour toute autre méthode, retournez"Unknown method: [method]"__toString()— Retourne"Collection([count] items)"où count est le nombre d'éléments__clone()— Lors du clonage, le tableau d'éléments doit être une nouvelle copie (pas une référence à l'original)
main.php— Incluez le fichier Collection. Vous recevrez trois entrées : un nom de clé, une valeur de rôle et un rôle de recherche. Construisez une collection d'utilisateurs et démontrez toutes les méthodes magiques :- Créez une nouvelle
Collection - Ajoutez un utilisateur avec la clé d'entrée, en stockant un tableau avec
"name"défini sur la clé et"role"défini sur la valeur de rôle d'entrée - Ajoutez un autre utilisateur avec la clé
"bob", en stockant["name" => "Bob", "role" => "editor"] - Affichez si la clé d'entrée existe en utilisant
isset()— affichez"exists"ou"missing" - Affichez le résultat de l'appel de la méthode dynamique
findByRole()avec le rôle de recherche comme argument (cela devrait retourner la clé de l'utilisateur correspondant, ou rien si null) - Affichez la collection en utilisant
echo(déclenche__toString) - Clonez la collection, puis supprimez la clé d'entrée du clone
- Affichez si la clé d'entrée existe dans la collection originale — affichez
"exists"ou"missing"(elle devrait toujours exister car le clone est indépendant)
- Créez une nouvelle
Chaque sortie doit être sur sa propre ligne. Le chercheur dynamique suppose que chaque élément de votre collection est un tableau associatif avec 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, en stockant le tableau avec "name" => key et "role" => roleValue
// TODO: Ajouter un autre utilisateur avec la clé "bob", en stockant ["name" => "Bob", "role" => "editor"]
// TODO: Afficher si la clé d'entrée existe en utilisant isset() - sortie "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 supprimer la clé d'entrée du clone avec unset
// 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
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie