Middle
Azt jelenti ez, hogy az osztály immutábilis, ha van nyilvános tulajdonsága az osztálynak?
sobes.tech MI
Válasz az MI-től
Nem.
Egy osztályban nyilvános tulajdonság azt jelenti, hogy ennek a tulajdonságnak az értéke kívülről módosítható az objektumon. Egy változatlan (immutable) objektum olyan, amelynek állapota (tulajdonságainak értékei) nem módosítható a létrehozás után. Egy nyilvános tulajdonság megléte ellentmond az immutable elvnek.
Az immutable eléréséhez az osztálynak a következő feltételeknek kell megfelelnie:
- Minden tulajdonságnak privát (
private) vagy védett (protected) kell lennie. - Nincs szetter (setter) metódus, amely módosítaná a tulajdonságokat.
- Minden függőség (az osztály által használt objektumok) szintén immutable kell legyen, vagy állapotuk nem változhat kívülről.
- A konstruktor teljes mértékben inicializálja az objektumot, és nem módosítható utána.
- Ha változtatások szükségesek, új példányokat kell létrehozni az új értékekkel.
Példa egy nyilvános tulajdonsággal rendelkező (mutable) osztályra:
<?php
class MutableObject
{
public $value; // Nyilvános tulajdonság
public function __construct($value)
{
$this->value = $value;
}
}
$obj = new MutableObject(10);
echo $obj->value; // 10
$obj->value = 20; // Az érték kívülről módosult
echo $obj->value; // 20
Példa egy immutable osztály megvalósítására:
<?php
class ImmutableObject
{
private $value; // Privát tulajdonság
public function __construct($value)
{
$this->value = $value;
}
public function getValue() : int
{
return $this->value;
}
// Metódus a "módosításhoz", valójában új objektumot hoz létre
public function withValue(int $newValue) : self
{
return new self($newValue);
}
}
$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10
// $obj1->value = 20; // Hiba: nem lehet hozzáférni a privát tulajdonsághoz
$obj2 = $obj1->withValue(20); // Új objektum jön létre
echo $obj1->getValue(); // 10 (az eredeti objektum nem változott)
echo $obj2->getValue(); // 20 (új objektum a módosított értékkel)