Pubblico, Protetto, Privato
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 38 di 91.
Benvenuto nel capitolo sull'incapsulamento! L'incapsulamento consiste nel controllare l'accesso ai dati interni della tua classe. PHP fornisce tre modificatori di accesso che determinano da dove è possibile accedere alle proprietà e ai metodi: public, protected e private.
Ecco come funziona ciascun modificatore:
<?php
class BankAccount {
public $accountHolder; // Accesible desde cualquier lugar
protected $accountNumber; // Accesible en esta clase y en las clases derivadas
private $balance; // Accesible solo en esta clase
public function __construct($holder, $number, $balance) {
$this->accountHolder = $holder;
$this->accountNumber = $number;
$this->balance = $balance;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount("John", "12345", 1000);
echo $account->accountHolder . "\n"; // Funciona - público
echo $account->getBalance(); // Funciona - método público
Output:
John
1000Provare ad accedere direttamente a $account->balance causerebbe un errore perché è privato. Lo stesso vale per $account->accountNumber dall'esterno della gerarchia della classe. Questa protezione garantisce che i dati sensibili possano essere modificati solo tramite metodi controllati.
| Modificatore | Stessa classe | Classe figlia | Esterno |
|---|---|---|---|
public | Sì | Sì | Sì |
protected | Sì | Sì | No |
private | Sì | No | No |
Punto chiave: usa private per i dati interni a cui non si dovrebbe accedere direttamente, protected per i dati necessari alle classi figlie e public solo per un accesso esterno sicuro.
Sfida
FacileCostruiamo un sistema sicuro di gestione dei dipendenti che mostri come i modificatori di accesso proteggono i dati sensibili. Creerai una gerarchia di classi in cui è possibile accedere a diversi livelli di informazioni a seconda di dove viene eseguito il codice: all'interno della classe, in una classe figlia o dall'esterno.
Organizzerai il codice in tre file:
Employee.php: crea una classeEmployeeche gestisce i dati dei dipendenti con i livelli di visibilità appropriati. La classe dovrebbe avere:- Una proprietà
public$nameper il nome del dipendente (visibile a chiunque) - Una proprietà
protected$employeeIdper l'ID interno (necessario alle classi figlie) - Una proprietà
private$salaryper le informazioni sensibili sulla retribuzione (a cui dovrebbe poter accedere direttamente solo questa classe)
getSalary()che restituisca lo stipendio privato. Questo è il modo controllato per accedere ai dati protetti. Aggiungi anche un metodo pubblicogetPublicInfo()che restituisca"[name] works here".- Una proprietà
Manager.php: crea una classeManagerche estendeEmployee. Includi il file Employee. Il costruttore dovrebbe accettare nome, employeeId, stipendio e il nome di un reparto. Chiama il costruttore genitore con i primi tre valori, poi salva il reparto in una proprietà privata. Aggiungi un metodo pubblicogetTeamInfo()che restituisca"Manager [name] (ID: [employeeId]) leads [department]". Nota come la classe figlia possa accedere a$employeeId, che è protetto, ma debba usaregetSalary()per accedere allo stipendio privato.main.php: includi il file Manager. Riceverai quattro input: un nome, un ID dipendente, uno stipendio (come stringa da convertire in un intero) e il nome di un reparto. Crea un'istanza diManagercon questi valori. Stampa tre righe:- Il nome del manager, a cui si accede direttamente (proprietà pubblica)
- Il risultato della chiamata a
getTeamInfo() - Il risultato della chiamata a
getSalary()
Questa sfida mostra l'incapsulamento in azione: il nome è accessibile liberamente, l'ID dipendente è condiviso con le classi figlie tramite la visibilità protetta e lo stipendio rimane nascosto nella classe genitore: è accessibile solo tramite un metodo pubblico controllato.
Provalo tu
<?php
require_once 'Manager.php';
// Leggi i dati di input
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));
// TODO: Crea un'istanza di Manager con i valori di input
// TODO: Stampa il nome del manager (accedendo direttamente alla proprietà pubblica)
// TODO: Stampa il risultato della chiamata a getTeamInfo()
// TODO: Stampa il risultato della chiamata a 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