Sobes.tech
Junior

Czym jest enkapsulacja w programowaniu obiektowym?

sobes.tech AI

Odpowiedź od AI

Enkapsulacja to połączenie danych (właściwości) i metod, które pracują z tymi danymi w jednostkowej istocie (obiekt lub klasa), a także ukrycie wewnętrznej implementacji przed światem zewnętrznym. Pozwala to kontrolować dostęp do danych i zmieniać wewnętrzną strukturę klasy bez wpływu na resztę kodu.

Główne aspekty enkapsulacji:

  1. Ukrywanie danych: Bezpośredni dostęp do wewnętrznych danych obiektu jest ograniczony. Dostęp odbywa się przez publiczne (public) metody – gettery (do pobierania danych) i settery (do ich modyfikacji).
  2. Przestrzeganie invariantów: Metody klasy mogą zawierać logikę do sprawdzania poprawności danych podczas ich ustawiania, zapewniając, że obiekt jest w ważnym stanie.

Przykład:

<?php
class User {
    private string $name; // Ukryta właściwość
    private int $age;    // Ukryta właściwość

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

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

    // Setter dla name z walidacją
    public function setName(string $name): void {
        // Można dodać walidację imienia
        $this->name = $name;
    }

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

    // Setter dla age z walidacją
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("Wiek nie może być mniejszy od zera.");
        }
        $this->age = $age;
    }

    // Metoda korzystająca z danych wewnętrznych
    public function introduce(): string {
        return "Nazywam się " . $this->name . " i mam " . $this->age . " lat.";
    }
}

// Użycie klasy
$user = new User("Ivan", 30);
echo $user->introduce(); // Wypisze: Nazywam się Ivan i mam 30 lat.

// Próba bezpośredniego dostępu do prywatnej właściwości spowoduje błąd:
// $user->age = -5; // Błąd krytyczny: Cannot access private property User::$age

// Użycie settera z walidacją
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nBłąd: " . $e->getMessage(); // Wypisze: Błąd: Wiek nie może być mniejszy od zera.
}