Sobes.tech
Junior

Mi az az inkapszuláció az objektumorientált programozásban?

sobes.tech MI

Válasz az MI-től

A kapszulázás az adatok (tulajdonságok) és azokkal dolgozó metódusok egyesítése egy egységes entitásban (objektum vagy osztály), valamint a belső megvalósítás elrejtése a külvilág elől. Ez lehetővé teszi az adatokhoz való hozzáférés kontrollálását és az osztály belső szerkezetének módosítását anélkül, hogy a többi kódot érintené.

A kapszulázás főbb aspektusai:

  1. Adatok elrejtése: Az objektum belső adatainak közvetlen hozzáférése korlátozott. A hozzáférés nyilvános (public) metódusokon keresztül történik — getterek (az adatok lekéréséhez) és setterek (az adatok módosításához).
  2. Invariánsok betartása: Az osztály metódusai tartalmazhatnak logikát az adatok helyességének ellenőrzésére, biztosítva, hogy az objektum érvényes állapotban maradjon.

Példa:

<?php
class User {
    private string $name; // Elrejtett tulajdonság
    private int $age;    // Elrejtett tulajdonság

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

    // Getter a névhez
    public function getName(): string {
        return $this->name;
    }

    // Setter a névhez validációval
    public function setName(string $name): void {
        // Szükség esetén hozzáadható név validáció
        $this->name = $name;
    }

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

    // Setter az életkorhoz validációval
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("Az életkor nem lehet kisebb nullánál.");
        }
        $this->age = $age;
    }

    // Metódus, amely belső adatokat használ
    public function introduce(): string {
        return "A nevem " . $this->name . " és " . $this->age . " éves vagyok.";
    }
}

// Osztály használata
$user = new User("Ivan", 30);
echo $user->introduce(); // Kimenet: A nevem Ivan és 30 éves vagyok.

// A közvetlen hozzáférés a privát tulajdonsághoz hibát okoz:
// $user->age = -5; // Fatális hiba: Cannot access private property User::$age

// Validációs setter használata
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nHiba: " . $e->getMessage(); // Kimenet: Hiba: Az életkor nem lehet kisebb nullánál.
}