Menu
Coddy logo textTech

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:

100

Tentare 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.com

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

challenge icon

Sfida

Facile

Costruiamo 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 classe Employee che 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 pubblico getName() che restituisce il nome, un metodo pubblico getSalary() che restituisce lo stipendio e un metodo pubblico giveRaise($amount) che aumenta lo stipendio dell'importo specificato.
  • Manager.php: definisci una classe Manager che estende Employee. 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 con parent::__construct($name, $salary), poi imposta il reparto. Crea un metodo getDetails() che restituisce "[name] manages [department]" accedendo direttamente alla proprietà protected $name. Aggiungi anche un metodo getDepartment() che restituisce il reparto.
  • main.php: includi entrambi i file delle classi. Crea un Manager con nome "Sarah", stipendio 75000 e reparto "Engineering". Stampa i dettagli del manager usando getDetails(). Poi concedi al manager un aumento di 5000 e stampa il nuovo stipendio usando getSalary(). 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()
?>
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