Sobes.tech
Middle

Betekent dit dat de klasse onveranderlijk is als deze een openbare eigenschap heeft?

sobes.tech AI

Antwoord van AI

Nee.

Een openbare eigenschap in een klasse betekent dat de waarde van die eigenschap van buiten het object kan worden gewijzigd. Een onveranderlijk object is er een waarvan de toestand (waarden van de eigenschappen) niet kan worden gewijzigd na creatie. Het hebben van een openbare eigenschap druist in tegen het principe van onveranderlijkheid.

Om onveranderlijkheid te bereiken, moet de klasse aan de volgende voorwaarden voldoen:

  • Alle eigenschappen moeten privé (private) of beschermd (protected) zijn.
  • Er mogen geen setters (methoden die de waarden van eigenschappen wijzigen) zijn.
  • Alle afhankelijkheden (objecten waarmee de klasse werkt) moeten ook onveranderlijk zijn of hun toestand mag niet van buitenaf veranderen.
  • De constructor moet het object volledig initialiseren en mag niet worden gewijzigd na creatie.
  • Als er wijzigingen nodig zijn, moeten nieuwe instanties van het object worden gemaakt met de nieuwe waarden.

Voorbeeld van een klasse met een openbare eigenschap (veranderlijk):

<?php
class MutableObject
{
    public $value; // Openbare eigenschap

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

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

$obj->value = 20; // Waarde gewijzigd van buitenaf
echo $obj->value; // 20

Voorbeeld van een implementatie van een onveranderlijke klasse:

<?php
class ImmutableObject
{
    private $value; // Privé eigenschap

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

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

    // Methode om "te wijzigen", creëert in feite een nieuw object
    public function withValue(int $newValue) : self
    {
        return new self($newValue);
    }
}

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

// $obj1->value = 20; // Fout: Kan niet bij privé eigenschap

$obj2 = $obj1->withValue(20); // Een nieuw object wordt gemaakt

echo $obj1->getValue(); // 10 (het originele object is niet veranderd)
echo $obj2->getValue(); // 20 (nieuw object met gewijzigde waarde)