Menu
Coddy logo textTech

Riepilogo - Collezione personalizzata

Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 50 di 91.

challenge icon

Sfida

Facile

Costruiamo 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 classe Collection che 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, oppure null se 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 con findBy (come findByRole o findByStatus), 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. Restituisci null se 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)

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

Esercitati da solo: Compilatore PHP online