Proprietà private e protected
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 18 di 91.
Finora abbiamo usato proprietà public accessibili da qualsiasi luogo. Ma a volte è necessario limitarne l'accesso per proteggere i dati. PHP fornisce altri due modificatori di visibilità: private e protected.
Una proprietà private può essere acceduta solo dall'interno della classe che la definisce:
<?php
class BankAccount {
private $balance = 0;
public function deposit($amount) {
$this->balance += $amount;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();
Output:
100Tentare di accedere direttamente a $account->balance dall'esterno della classe causerebbe un errore. Questo protegge il saldo da modifiche senza passare attraverso il metodo deposit.
Una proprietà protected funziona in modo simile, ma è accessibile anche dalle classi figlie che estendono la classe genitore:
<?php
class User {
protected $email;
public function __construct($email) {
$this->email = $email;
}
}
class Admin extends User {
public function showEmail() {
return $this->email;
}
}
$admin = new Admin("admin@example.com");
echo $admin->showEmail();
Output:
admin@example.comPunto chiave: Usa private quando solo la classe che definisce la proprietà deve potervi accedere. Usa protected quando anche le classi figlie devono potervi accedere. Entrambi impediscono l'accesso diretto dall'esterno, mantenendo al sicuro lo stato interno del tuo oggetto.
Sfida
FacileCostruiamo un sistema sicuro di gestione dei dipendenti che dimostra come proteggere i dati sensibili usando proprietà private e protected.
Creerai tre file che collaborano per gestire le informazioni dei dipendenti con un adeguato controllo degli accessi:
Employee.php: definisci una classeEmployeeche funge da base per tutti i dipendenti. Dovrebbe avere una proprietàprotected $name(così le classi figlie possono accedervi) e una proprietàprivate $salary(solo questa classe dovrebbe modificare direttamente gli stipendi). Il costruttore accetta un nome e uno stipendio e imposta entrambe le proprietà. Aggiungi un metodo pubblicogetName()che restituisce il nome, un metodo pubblicogetSalary()che restituisce lo stipendio e un metodo pubblicogiveRaise($amount)che aumenta lo stipendio dell'importo specificato.Manager.php: definisci una classeManagerche estendeEmployee. Includi il file Employee all'inizio. Aggiungi una proprietà privata$department. Il costruttore dovrebbe accettare nome, stipendio e reparto: chiama il costruttore della classe genitore conparent::__construct($name, $salary), poi imposta il reparto. Crea un metodogetDetails()che restituisce"[name] manages [department]"accedendo direttamente alla proprietà protected$name. Aggiungi anche un metodogetDepartment()che restituisce il reparto.main.php: includi entrambi i file delle classi. Crea unManagercon nome"Sarah", stipendio75000e reparto"Engineering". Stampa i dettagli del manager usandogetDetails(). Poi concedi al manager un aumento di5000e stampa il nuovo stipendio usandogetSalary(). Ogni risultato dovrebbe essere su una riga a sé.
Nota come la classe Manager può accedere direttamente alla proprietà protected $name, ma deve usare il metodo getSalary() per accedere allo stipendio privato. Questo dimostra la differenza fondamentale tra la visibilità protected e private: protected consente l'accesso alle classi figlie, mentre private mantiene i dati effettivamente nascosti.
Provalo tu
<?php
require_once 'Employee.php';
require_once 'Manager.php';
// TODO: Crea un Manager con nome "Sarah", stipendio 75000 e reparto "Engineering"
// TODO: Stampa i dettagli del manager usando getDetails()
// TODO: Dai al manager un aumento di 5000
// TODO: Stampa il nuovo stipendio usando getSalary()
?>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