Getter e Setter
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 40 di 91.
Ora che hai capito i modificatori di accesso, come puoi interagire in sicurezza con le proprietà private dall'esterno della classe? La risposta è getter e setter: metodi pubblici che consentono un accesso controllato ai dati privati.
Un getter recupera il valore di una proprietà, mentre un setter lo modifica. Questo schema ti permette di aggiungere convalide o logica quando i dati vengono letti o modificati:
<?php
class User {
private string $email;
private int $age;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
}
}
public function getAge(): int {
return $this->age;
}
public function setAge(int $age): void {
if ($age >= 0 && $age <= 150) {
$this->age = $age;
}
}
}
$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);
echo $user->getEmail() . "\n";
echo $user->getAge();
Output:
john@example.com
25Il setter convalida il formato dell'email e verifica che l'età sia ragionevole prima di memorizzare i valori. Senza setter, chiunque potrebbe assegnare direttamente dati non validi. Puoi anche creare proprietà di sola lettura fornendo solo un getter, o proprietà di sola scrittura con solo un setter.
Punto chiave: I metodi getter e setter ti consentono di controllare come si accede ai dati privati e come vengono modificati, permettendoti di applicare convalide, formattazioni o qualsiasi logica personalizzata.
Sfida
FacileCostruiamo un sistema di inventario dei prodotti che usa getter e setter per proteggere e convalidare i dati dei prodotti. Creerai una classe Product che garantisce che i prezzi siano sempre positivi e che le quantità in magazzino non siano mai negative: così vedrai come i setter possono applicare le regole aziendali.
Organizzerai il codice in due file:
Product.php: crea una classeProductcon tre proprietà private:$name(stringa),$price(float) e$stock(intero). Implementa getter e setter per ogni proprietà con le seguenti regole di convalida:setName()deve accettare solo stringhe non vuote; se la stringa è vuota dopo aver rimosso gli spazi iniziali e finali, non aggiornare la proprietàsetPrice()deve accettare solo valori maggiori di 0: rifiuta i prezzi pari a zero o negativisetStock()deve accettare solo valori maggiori o uguali a 0: rifiuta le quantità in magazzino negative
getInfo()che restituisce"[name]: $[price] ([stock] in stock)"con il prezzo formattato con 2 cifre decimali.main.php: includi il file Product. Riceverai quattro input: il nome di un prodotto, un prezzo, una quantità in magazzino e un nuovo prezzo da impostare. Crea un'istanza diProducte usa i setter per assegnare il nome iniziale, il prezzo (convertito in float) e la quantità in magazzino (convertita in intero). Stampa il risultato digetInfo(). Poi prova ad aggiornare il prezzo con il nuovo valore (convertito in float) e stampa di nuovogetInfo(). Infine, prova a impostare la quantità in magazzino a-5(un valore non valido) e stampa ancora una voltagetInfo()per confermare che la quantità in magazzino non sia cambiata.
I tuoi setter fungono da guardiani. Convalidano i dati in ingresso prima di consentire modifiche alle proprietà private. Quando vengono passati dati non validi (come una quantità in magazzino negativa), il setter li ignora semplicemente, mantenendo intatto il valore valido esistente. Questo è il potere dell'incapsulamento: il tuo oggetto mantiene la propria integrità indipendentemente da ciò che il codice esterno cerca di fare.
Provalo tu
<?php
require_once 'Product.php';
// Leggi i dati di input
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));
// TODO: Crea una nuova istanza di Product
// TODO: Usa i setter per assegnare il nome iniziale, il prezzo (come float) e la giacenza (come integer)
// TODO: Stampa il risultato di getInfo()
// TODO: Aggiorna il prezzo con newPrice (come float) e stampa di nuovo getInfo()
// TODO: Prova a impostare la giacenza a -5 (valore non valido) e stampa getInfo() per verificare che non sia cambiata
?>Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
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