Menu
Coddy logo textTech

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
1000

Provare 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.

ModificatoreStessa classeClasse figliaEsterno
publicSìSìSì
protectedSìSìNo
privateSìNoNo

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.

challenge icon

Sfida

Facile

Costruiamo 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 classe Employee che gestisce i dati dei dipendenti con i livelli di visibilità appropriati. La classe dovrebbe avere:
    • Una proprietà public $name per il nome del dipendente (visibile a chiunque)
    • Una proprietà protected $employeeId per l'ID interno (necessario alle classi figlie)
    • Una proprietà private $salary per le informazioni sensibili sulla retribuzione (a cui dovrebbe poter accedere direttamente solo questa classe)
    Il costruttore dovrebbe accettare tutti e tre i valori e assegnarli. Aggiungi un metodo pubblico getSalary() che restituisca lo stipendio privato. Questo è il modo controllato per accedere ai dati protetti. Aggiungi anche un metodo pubblico getPublicInfo() che restituisca "[name] works here".
  • Manager.php: crea una classe Manager che estende Employee. 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 pubblico getTeamInfo() che restituisca "Manager [name] (ID: [employeeId]) leads [department]". Nota come la classe figlia possa accedere a $employeeId, che è protetto, ma debba usare getSalary() 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 di Manager con 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()
?>
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore PHP online