Sobes.tech
Junior

Wat is encapsulatie in objectgeoriënteerd programmeren?

sobes.tech AI

Antwoord van AI

Encapsulatie is de samenvoeging van gegevens (eigenschappen) en methoden die met deze gegevens werken in een entiteit (object of klasse), evenals het verbergen van de interne implementatie voor de buitenwereld. Dit stelt je in staat om de toegang tot gegevens te controleren en de interne structuur van de klasse te wijzigen zonder de rest van de code te beïnvloeden.

Belangrijke aspecten van encapsulatie:

  1. Gegevensverbergings: Directe toegang tot de interne gegevens van het object wordt beperkt. Toegang wordt verkregen via openbare (public) methoden — getters (voor het verkrijgen van gegevens) en setters (voor het wijzigen van gegevens).
  2. Inachtneming van invarianten: De methoden van de klasse kunnen logica bevatten om de correctheid van de gegevens te controleren bij het instellen ervan, zodat het object in een geldige toestand blijft.

Voorbeeld:

<?php
class User {
    private string $name; // Verborgen eigenschap
    private int $age;    // Verborgen eigenschap

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

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

    // Setter voor name met validatie
    public function setName(string $name): void {
        // Validatie van naam kan indien nodig worden toegevoegd
        $this->name = $name;
    }

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

    // Setter voor age met validatie
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("Leeftijd kan niet minder dan nul zijn.");
        }
        $this->age = $age;
    }

    // Methode die interne gegevens gebruikt
    public function introduce(): string {
        return "Mijn naam is " . $this->name . " en ik ben " . $this->age . " jaar oud.";
    }
}

// Gebruik van de klasse
$user = new User("Ivan", 30);
echo $user->introduce(); // Uitvoer: Mijn naam is Ivan en ik ben 30 jaar oud.

// Poging tot directe toegang tot de private eigenschap zal een fout veroorzaken:
// $user->age = -5; // Fatale fout: Cannot access private property User::$age

// Gebruik van de setter met validatie
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nFout: " . $e->getMessage(); // Uitvoer: Fout: Leeftijd kan niet minder dan nul zijn.
}