Middle
Znamená to, že třída je neměnná, pokud má veřejnou vlastnost?
sobes.tech AI
Odpověď od AI
Ne.
Veřejná vlastnost ve třídě znamená, že její hodnota může být změněna zvenčí objektu. Neměnný (immutable) objekt je takový, jehož stav (hodnoty jeho vlastností) nelze po vytvoření změnit. Přítomnost veřejné vlastnosti odporuje principu neměnnosti.
Pro dosažení neměnnosti musí třída splnit následující podmínky:
- Všechny vlastnosti musí být soukromé (
private) nebo chráněné (protected). - Nemají být žádné setter metody (metody, které mění hodnoty vlastností).
- Všechny závislosti (objekty, se kterými třída pracuje) musí být také neměnné nebo jejich stav se nesmí měnit zvenčí.
- Konstruktor musí plně inicializovat objekt a po jeho vytvoření nesmí být měněn.
- Pokud jsou potřeba změny, měly by být vytvářeny nové instance objektu s novými hodnotami.
Příklad třídy s veřejnou vlastností (mutable):
<?php
class MutableObject
{
public $value; // Veřejná vlastnost
public function __construct($value)
{
$this->value = $value;
}
}
$obj = new MutableObject(10);
echo $obj->value; // 10
$obj->value = 20; // Hodnota změněna zvenčí
echo $obj->value; // 20
Příklad implementace neměnné třídy:
<?php
class ImmutableObject
{
private $value; // Privátní vlastnost
public function __construct($value)
{
$this->value = $value;
}
public function getValue() : int
{
return $this->value;
}
// Metoda pro "změnu", ve skutečnosti vytváří nový objekt
public function withValue(int $newValue) : self
{
return new self($newValue);
}
}
$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10
// $obj1->value = 20; // Chyba: Nelze přistoupit k privátní vlastnosti
$obj2 = $obj1->withValue(20); // Vytvoří se nový objekt
echo $obj1->getValue(); // 10 (původní objekt se nezměnil)
echo $obj2->getValue(); // 20 (nový objekt s upravenou hodnotou)