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