Riepilogo - Collezione personalizzata
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 50 di 91.
Sfida
FacileCostruiamo una classe Collection che riunisca tutti i metodi magici che hai imparato in questo capitolo. La tua collezione fungerà da contenitore flessibile di dati, naturale da usare: memorizzerà elementi tramite chiavi, verificherà se esistono, troverà elementi in modo dinamico e creerà copie indipendenti.
Organizzerai il codice in due file:
Collection.php: crea una classeCollectionche memorizza gli elementi in un array privato. La tua collezione deve supportare i seguenti metodi magici, che lavorano insieme:__construct(): accetta un array facoltativo di elementi iniziali (il valore predefinito è un array vuoto)__get($key): restituisce l'elemento con la chiave specificata, oppurenullse non esiste__set($key, $value): memorizza il valore con la chiave specificata__isset($key): restituisce se la chiave esiste nella collezione__unset($key): rimuove l'elemento con la chiave specificata__call($method, $args): gestisce i metodi di ricerca dinamici. Quando viene chiamato un metodo che inizia confindBy(comefindByRoleofindByStatus), estrai il nome del campo (converti in minuscolo la parte successiva a "findBy"), cerca tra tutti gli elementi e restituisci la chiave del primo elemento in cui il campo corrisponde al primo argomento. Restituiscinullse non trovi corrispondenze. Per qualsiasi altro metodo, restituisci"Unknown method: [method]"__toString(): restituisce"Collection([count] items)", dove count è il numero di elementi__clone(): quando la collezione viene clonata, l'array degli elementi deve essere una copia autonoma (non un riferimento all'originale)
main.php: includi il file Collection. Riceverai tre input: il nome di una chiave, un valore per il ruolo e un ruolo da cercare. Crea una collezione di utenti e mostra tutti i metodi magici:- Crea una nuova
Collection - Aggiungi un utente con la chiave di input, memorizzando un array con
"name"impostato sulla chiave e"role"impostato sul valore di input del ruolo - Aggiungi un altro utente con la chiave
"bob", memorizzando["name" => "Bob", "role" => "editor"] - Stampa se la chiave di input esiste usando
isset(): output"exists"oppure"missing" - Stampa il risultato della chiamata al metodo dinamico
findByRole()con il ruolo da cercare come argomento (dovrebbe restituire la chiave dell'utente corrispondente, oppure niente se il risultato è null) - Stampa la collezione usando
echo(attiva__toString) - Clona la collezione, quindi rimuovi dalla copia la chiave di input
- Stampa se la chiave di input esiste nella collezione originale: output
"exists"oppure"missing"(dovrebbe esistere ancora, perché la copia è indipendente)
- Crea una nuova
Ogni output deve essere su una riga a sé. Il metodo di ricerca dinamico presuppone che ogni elemento della collezione sia un array associativo con campi come "name" e "role".
Provalo tu
<?php
require_once 'Collection.php';
// Leggi gli input
$keyName = trim(fgets(STDIN));
$roleValue = trim(fgets(STDIN));
$searchRole = trim(fgets(STDIN));
// TODO: Crea una nuova Collection
// TODO: Aggiungi un utente con la chiave di input, memorizzando un array con "name" => chiave e "role" => roleValue
// TODO: Aggiungi un altro utente con la chiave "bob", memorizzando ["name" => "Bob", "role" => "editor"]
// TODO: Stampa se la chiave di input esiste usando isset() - restituisci "exists" o "missing"
// TODO: Stampa il risultato della chiamata a findByRole() con searchRole come argomento
// TODO: Stampa la raccolta usando echo (attiva __toString)
// TODO: Clona la raccolta, poi rimuovi la chiave di input dal clone
// TODO: Stampa se la chiave di input esiste nella raccolta ORIGINALE - "exists" o "missing"
?>Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online