Sobes.tech
Middle

Significa che la classe è immutabile se ha una proprietà pubblica nella classe?

sobes.tech AI

Risposta dell'AI

No.

Una proprietà pubblica in una classe significa che il valore di questa proprietà può essere modificato dall'esterno dell'oggetto. Un oggetto immutabile è quello il cui stato (valori delle sue proprietà) non può essere modificato dopo la creazione. La presenza di una proprietà pubblica contraddice il principio di immutabilità.

Per raggiungere l'immutabilità, la classe deve rispettare le seguenti condizioni:

  • Tutte le proprietà devono essere private (private) o protette (protected).
  • Non devono esserci setter (metodi che modificano i valori delle proprietà).
  • Tutte le dipendenze (oggetti con cui lavora la classe) devono essere anch'esse immutabili o il loro stato non deve cambiare dall'esterno.
  • Il costruttore deve inizializzare completamente l'oggetto e non deve essere modificato dopo la creazione.
  • Se sono necessari cambiamenti, devono essere create nuove istanze dell'oggetto con i nuovi valori.

Esempio di una classe con una proprietà pubblica (mutabile):

<?php
class MutableObject
{
    public $value; // Proprietà pubblica

    public function __construct($value)
    {
        $this->value = $value;
    }
}

$obj = new MutableObject(10);
echo $obj->value; // 10

$obj->value = 20; // Valore modificato dall'esterno
echo $obj->value; // 20

Esempio di implementazione di una classe immutabile:

<?php
class ImmutableObject
{
    private $value; // Proprietà privata

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function getValue() : int
    {
        return $this->value;
    }

    // Metodo per "modificare", in realtà crea un nuovo oggetto
    public function withValue(int $newValue) : self
    {
        return new self($newValue);
    }
}

$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10

// $obj1->value = 20; // Errore: impossibile accedere alla proprietà privata

$obj2 = $obj1->withValue(20); // Viene creato un nuovo oggetto

echo $obj1->getValue(); // 10 (l'oggetto originale non è cambiato)
echo $obj2->getValue(); // 20 (nuovo oggetto con il valore modificato)