Middle
Este înseamnă că clasa este imutabilă dacă are o proprietate publică în clasă?
sobes.tech AI
Răspuns de la AI
Nu.
O proprietate publică într-o clasă înseamnă că valoarea acestei proprietăți poate fi modificată din exteriorul obiectului. Un obiect imutabil este cel al cărui stadiu (valorile proprietăților sale) nu poate fi schimbat după creare. Prezența unei proprietăți publice contrazice principiul imutabilității.
Pentru a atinge imutabilitatea, clasa trebuie să respecte următoarele condiții:
- Toate proprietățile trebuie să fie private (
private) sau protejate (protected). - Nu trebuie să existe setter-uri (metode care schimbă valorile proprietăților).
- Toate dependențele (obiecte cu care lucrează clasa) trebuie, de asemenea, să fie imutabile sau starea lor nu trebuie să se schimbe din exterior.
- Constructorul trebuie să initializeze complet obiectul și să nu fie modificat după creare.
- Dacă sunt necesare modificări, trebuie create noi instanțe ale obiectului cu valorile noi.
Exemplu de clasă cu o proprietate publică (mutabilă):
<?php
class MutableObject
{
public $value; // Proprietate publică
public function __construct($value)
{
$this->value = $value;
}
}
$obj = new MutableObject(10);
echo $obj->value; // 10
$obj->value = 20; // Valoare schimbată din exterior
echo $obj->value; // 20
Exemplu de implementare a unei clase imutabile:
<?php
class ImmutableObject
{
private $value; // Proprietate privată
public function __construct($value)
{
$this->value = $value;
}
public function getValue() : int
{
return $this->value;
}
// Metodă pentru "schimbare", creează de fapt un nou obiect
public function withValue(int $newValue) : self
{
return new self($newValue);
}
}
$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10
// $obj1->value = 20; // Eroare: Nu se poate accesa proprietatea privată
$obj2 = $obj1->withValue(20); // Se creează un nou obiect
echo $obj1->getValue(); // 10 (obiectul original nu s-a schimbat)
echo $obj2->getValue(); // 20 (nou obiect cu valoarea modificată)