Junior
Ce este încapsularea în programarea orientată pe obiecte?
sobes.tech AI
Răspuns de la AI
Încapsularea reprezintă combinarea datelor (proprietăților) și a metodelor care lucrează cu aceste date într-o entitate unică (obiect sau clasă), precum și ascunderea implementării interne de lumea exterioară. Acest lucru permite controlul accesului la date și modificarea structurii interne a clasei fără a afecta restul codului.
Aspecte principale ale încapsulării:
- Ascunderea datelor: Accesul direct la datele interne ale obiectului este restricționat. Accesul se face prin metode publice (getters) pentru obținerea datelor și setters pentru modificarea datelor.
- Respectarea invariabilităților: Metodele clasei pot conține logică pentru verificarea corectitudinii datelor la stabilirea acestora, asigurând că obiectul rămâne într-o stare validă.
Exemplu:
<?php
class User {
private string $name; // Proprietate ascunsă
private int $age; // Proprietate ascunsă
public function __construct(string $name, int $age) {
$this->setName($name);
$this->setAge($age);
}
// Getter pentru nume
public function getName(): string {
return $this->name;
}
// Setter pentru nume cu validare
public function setName(string $name): void {
// Se poate adăuga validare pentru nume dacă este necesar
$this->name = $name;
}
// Getter pentru vârstă
public function getAge(): int {
return $this->age;
}
// Setter pentru vârstă cu validare
public function setAge(int $age): void {
if ($age < 0) {
throw new InvalidArgumentException("Vârsta nu poate fi mai mică de zero.");
}
$this->age = $age;
}
// Metodă care utilizează datele interne
public function introduce(): string {
return "Numele meu este " . $this->name . " și am " . $this->age . " ani.";
}
}
// Utilizarea clasei
$user = new User("Ivan", 30);
echo $user->introduce(); // Afișare: Numele meu este Ivan și am 30 de ani.
// Încercarea de a accesa direct proprietatea privată va cauza o eroare:
// $user->age = -5; // Eroare fatală: Cannot access private property User::$age
// Utilizarea setter-ului cu validare
try {
$user->setAge(-5);
} catch (InvalidArgumentException $e) {
echo "\nEroare: " . $e->getMessage(); // Afișare: Eroare: Vârsta nu poate fi mai mică de zero.
}