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