Middle
Znamená to, že trieda je nemenná, ak má verejnú vlastnosť?
sobes.tech AI
Odpoveď od AI
Nie.
Verejné vlastnosti v triede znamenajú, že hodnota tejto vlastnosti môže byť zmenená zvonku objektu. Nemenný (immutable) objekt je taký, ktorého stav (hodnoty jeho vlastností) nemôže byť zmenený po vytvorení. Prítomnosť verejnej vlastnosti odporuje princípu nemennosti.
Na dosiahnutie nemennosti musí trieda spĺňať nasledujúce podmienky:
- Všetky vlastnosti musia byť súkromné (
private) alebo chránené (protected). - Nemajú existovať setter metódy (metódy, ktoré menia hodnoty vlastností).
- Všetky závislosti (objekty, s ktorými trieda pracuje) musia byť tiež nemenné alebo ich stav sa nemôže meniť zvonku.
- Konštruktor musí úplne inicializovať objekt a nemôže sa meniť po vytvorení.
- Ak sú potrebné zmeny, mali by byť vytvorené nové inštancie objektu s novými hodnotami.
Príklad triedy s verejnou vlastnosťou (zmeniteľnou):
<?php
class MutableObject
{
public $value; // Verejná vlastnosť
public function __construct($value)
{
$this->value = $value;
}
}
$obj = new MutableObject(10);
echo $obj->value; // 10
$obj->value = 20; // Hodnota zmenená zvonku
echo $obj->value; // 20
Príklad implementácie nemenné triedy:
<?php
class ImmutableObject
{
private $value; // Súkromná vlastnosť
public function __construct($value)
{
$this->value = $value;
}
public function getValue() : int
{
return $this->value;
}
// Metóda na "zmenu", v skutočnosti vytvára nový objekt
public function withValue(int $newValue) : self
{
return new self($newValue);
}
}
$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10
// $obj1->value = 20; // Chyba: Nie je možné pristúpiť k súkromnej vlastnosti
$obj2 = $obj1->withValue(20); // Vytvára sa nový objekt
echo $obj1->getValue(); // 10 (pôvodný objekt sa nezmenil)
echo $obj2->getValue(); // 20 (nový objekt s upravenou hodnotou)