Sobes.tech
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ą)