Sobes.tech
Junior

Cos'è l'incapsulamento nella programmazione orientata agli oggetti?

sobes.tech AI

Risposta dell'AI

L'incapsulamento è l'unione di dati (proprietà) e metodi che lavorano con questi dati in un'entità unica (oggetto o classe), così come la nascosta implementazione interna dal mondo esterno. Questo permette di controllare l'accesso ai dati e modificare la struttura interna della classe senza influenzare il resto del codice.

Aspetti principali dell'incapsulamento:

  1. Nascondere i dati: L'accesso diretto ai dati interni dell'oggetto è limitato. L'accesso avviene tramite metodi pubblici (getters) per ottenere i dati e setters per modificarli.
  2. Rispetto degli invarianti: I metodi della classe possono contenere logica per verificare la correttezza dei dati durante la loro impostazione, garantendo che l'oggetto sia in uno stato valido.

Esempio:

<?php
class User {
    private string $name; // Proprietà nascosta
    private int $age;    // Proprietà nascosta

    public function __construct(string $name, int $age) {
        $this->setName($name);
        $this->setAge($age);
    }

    // Getter per name
    public function getName(): string {
        return $this->name;
    }

    // Setter per name con validazione
    public function setName(string $name): void {
        // È possibile aggiungere validazione del nome se necessario
        $this->name = $name;
    }

    // Getter per age
    public function getAge(): int {
        return $this->age;
    }

    // Setter per age con validazione
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("L'età non può essere inferiore a zero.");
        }
        $this->age = $age;
    }

    // Metodo che utilizza i dati interni
    public function introduce(): string {
        return "Mi chiamo " . $this->name . " e ho " . $this->age . " anni.";
    }
}

// Uso della classe
$user = new User("Ivan", 30);
echo $user->introduce(); // Output: Mi chiamo Ivan e ho 30 anni.

// Tentativo di accesso diretto alla proprietà privata causerà errore:
// $user->age = -5; // Errore fatale: Cannot access private property User::$age

// Uso del setter con validazione
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nErrore: " . $e->getMessage(); // Output: Errore: L'età non può essere inferiore a zero.
}