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:
- 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.
- 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.
}