Junior
Co je to zapouzdření v objektově orientovaném programování?
sobes.tech AI
Odpověď od AI
Zapouzdření je spojení dat (vlastností) a metod, které s těmito daty pracují, do jedné entity (objekt nebo třída), stejně jako skrytí vnitřní implementace před vnějším světem. To umožňuje kontrolovat přístup k datům a měnit vnitřní strukturu třídy, aniž by to ovlivnilo ostatní kód.
Hlavní aspekty zapouzdření:
- Skrytí dat: Přímý přístup k vnitřním datům objektu je omezen. Přístup je umožněn prostřednictvím veřejných (public) metod-getterů (pro získání dat) a setterů (pro změnu dat).
- Dodržování invariantů: Metody třídy mohou obsahovat logiku pro kontrolu správnosti dat při jejich nastavování, což zajišťuje, že objekt je ve validním stavu.
Příklad:
<?php
class User {
private string $name; // Skrytá vlastnost
private int $age; // Skrytá vlastnost
public function __construct(string $name, int $age) {
$this->setName($name);
$this->setAge($age);
}
// Getter pro name
public function getName(): string {
return $this->name;
}
// Setter pro name s možnou validací
public function setName(string $name): void {
// Případná validace jména
$this->name = $name;
}
// Getter pro age
public function getAge(): int {
return $this->age;
}
// Setter pro age s validací
public function setAge(int $age): void {
if ($age < 0) {
throw new InvalidArgumentException("Věk nemůže být záporný.");
}
$this->age = $age;
}
// Metoda využívající vnitřní data
public function introduce(): string {
return "Jmenuji se " . $this->name . " a je mi " . $this->age . " let.";
}
}
// Použití třídy
$user = new User("Ivan", 30);
echo $user->introduce(); // Výstup: Jmenuji se Ivan a je mi 30 let.
// Pokus o přímý přístup k soukromé vlastnosti způsobí chybu:
// $user->age = -5; // Fatální chyba: Uncaught Error: Cannot access private property User::$age
// Použití setteru s validací
try {
$user->setAge(-5);
} catch (InvalidArgumentException $e) {
echo "\nChyba: " . $e->getMessage(); // Výstup: Chyba: Věk nemůže být záporný.
}
Výhody zapouzdření:
- Kontrola přístupu: Určuje, jak mohou vnější objekty interagovat s daty třídy.
- Flexibilita: Umožňuje měnit vnitřní implementaci třídy bez nutnosti měnit vnější kód, který ji používá.
- Zlepšení údržby kódu: Usnadňuje ladění a modifikaci, protože změny jsou omezeny uvnitř třídy.
- Ochrana dat: Zabraňuje nesprávné změně stavu objektu.