Menu
Coddy logo textTech

Approfondimento sui modificatori di accesso

Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 39 di 91.

Ora che hai compreso i tre modificatori di accesso, esploriamo come si comportano negli scenari di ereditarietà. L'intuizione fondamentale è che i membri protected diventano accessibili alle classi figlie, mentre i membri private rimangono nascosti anche ai figli.

<?php
class Vehicle {
    public $brand;
    protected $engineType;
    private $serialNumber;
    
    public function __construct($brand, $engine, $serial) {
        $this->brand = $brand;
        $this->engineType = $engine;
        $this->serialNumber = $serial;
    }
    
    private function getSerial() {
        return $this->serialNumber;
    }
    
    protected function getEngineInfo() {
        return $this->engineType;
    }
}

class Car extends Vehicle {
    public function getDetails() {
        return $this->brand . " - " . $this->getEngineInfo();
        // $this->serialNumber would cause an error - private!
        // $this->getSerial() would also fail - private method!
    }
}

$car = new Car("Toyota", "V6", "ABC123");
echo $car->getDetails();

Output:

Toyota - V6

La classe Car può accedere a $brand (pubblico) e chiamare getEngineInfo() (protetto), ma non può accedere a $serialNumber o getSerial() perché sono privati di Vehicle. Questa distinzione ti permette di condividere alcuni dettagli interni con le classi figlie, mantenendone altri completamente nascosti.

Punto chiave: Usa protected quando le classi figlie devono accedere ai dati interni o ai metodi, e private quando nemmeno le classi figlie dovrebbero intervenire su determinati dettagli di implementazione.

challenge icon

Sfida

Facile

Creiamo un sistema di gestione dei dispositivi che esplora il comportamento dei modificatori di accesso nell’ereditarietà. Creerai una classe base Device con proprietà a diversi livelli di visibilità, poi la estenderai con una classe Smartphone che mostra a quali membri le classi figlie possono o non possono accedere.

Organizzerai il codice in tre file:

  • Device.php: crea una classe Device che rappresenta dispositivi elettronici con diversi livelli di sensibilità dei dati. Includi:
    • Una proprietà public $brand per il nome del produttore
    • Una proprietà protected $modelNumber per l’identificazione interna
    • Una proprietà private $manufacturingCode per i dati riservati alla fabbrica
    Il costruttore deve accettare tutti e tre i valori. Aggiungi un metodo private getManufacturingCode() che restituisce il codice di produzione. Aggiungi un metodo public getModelInfo() che restituisce "Model: [modelNumber]". Infine, aggiungi un metodo public getFullCode() che restituisce "[brand]-[manufacturingCode]". Questo dimostra come la classe stessa possa accedere ai propri membri privati.
  • Smartphone.php: crea una classe Smartphone che estende Device. Includi il file Device. Il costruttore deve accettare brand, modelNumber, manufacturingCode e il nome di un sistema operativo. Chiama il costruttore del genitore con i primi tre valori, poi memorizza il sistema operativo in una proprietà privata. Aggiungi un metodo pubblico getDeviceDetails() che restituisce "[brand] [modelNumber] running [os]". Nota che puoi accedere direttamente alla proprietà pubblica $brand e alla proprietà protetta $modelNumber, ma non puoi accedere direttamente alla proprietà privata $manufacturingCode: dovrai invece usare il metodo pubblico ereditato getFullCode().
  • main.php: includi il file Smartphone. Riceverai quattro input: un nome di marca, un numero di modello, un codice di produzione e un sistema operativo. Crea un’istanza di Smartphone con questi valori. Stampa tre righe:
    • Il risultato della chiamata a getDeviceDetails()
    • Il risultato della chiamata al metodo ereditato getModelInfo()
    • Il risultato della chiamata al metodo ereditato getFullCode()

Questa sfida mette in evidenza la distinzione fondamentale: la classe Smartphone può usare liberamente la proprietà protetta $modelNumber ereditata da Device, ma la proprietà privata $manufacturingCode e il metodo getManufacturingCode() restano completamente nascosti: sono accessibili solo tramite l’interfaccia pubblica che Device sceglie di esporre.

Provalo tu

<?php
require_once 'Smartphone.php';

// Leggi i dati di input
$brand = trim(fgets(STDIN));
$modelNumber = trim(fgets(STDIN));
$manufacturingCode = trim(fgets(STDIN));
$os = trim(fgets(STDIN));

// TODO: Crea un'istanza di Smartphone con i valori di input

// TODO: Stampa il risultato di getDeviceDetails()

// TODO: Stampa il risultato del metodo ereditato getModelInfo()

// TODO: Stampa il risultato del metodo ereditato getFullCode()
?>
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