Middle
Czy oznacza to, że klasa jest niezmienna, jeśli ma publiczną właściwość?
sobes.tech AI
Odpowiedź od AI
Nie.
Właściwość publiczna w klasie oznacza, że wartość tej właściwości może być zmieniona spoza obiektu. Obiekt niezmienny to taki, którego stan (wartości jego właściwości) nie może być zmieniony po utworzeniu. Obecność właściwości publicznej przeczy zasadzie niezmienności.
Aby osiągnąć niezmienność, klasa musi spełniać następujące warunki:
- Wszystkie właściwości muszą być prywatne (
private) lub chronione (protected). - Nie mogą być settery (metody zmieniające wartości właściwości).
- Wszystkie zależności (obiekty, z którymi pracuje klasa) również muszą być niezmiennicze lub ich stan nie może być zmieniany spoza.
- Konstruktor musi w pełni inicjalizować obiekt i nie może być zmieniany po utworzeniu.
- Jeśli są potrzebne zmiany, należy tworzyć nowe instancje obiektu z nowymi wartościami.
Przykład klasy z właściwością publiczną (zmienną):
<?php
class MutableObject
{
public $value; // Właściwość publiczna
public function __construct($value)
{
$this->value = $value;
}
}
$obj = new MutableObject(10);
echo $obj->value; // 10
$obj->value = 20; // Wartość zmieniona spoza
echo $obj->value; // 20
Przykład implementacji klasy niezmienniczej:
<?php
class ImmutableObject
{
private $value; // Właściwość prywatna
public function __construct($value)
{
$this->value = $value;
}
public function getValue() : int
{
return $this->value;
}
// Metoda "zmieniająca" wartość, w rzeczywistości tworzy nowy obiekt
public function withValue(int $newValue) : self
{
return new self($newValue);
}
}
$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10
// $obj1->value = 20; // Błąd: nie można uzyskać dostępu do prywatnej właściwości
$obj2 = $obj1->withValue(20); // Tworzy nowy obiekt
echo $obj1->getValue(); // 10 (oryginalny obiekt się nie zmienił)
echo $obj2->getValue(); // 20 (nowy obiekt z zmienioną wartością)