Sobes.tech
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:

  1. 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.
  2. 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.
}