Sobes.tech
Middle

Ar tai reiškia, kad klasė yra nekintama, jei ji turi viešą savybę?

sobes.tech AI

Atsakymas iš AI

Ne.

Viešojo pobūdžio savybė klasėje reiškia, kad šios savybės reikšmė gali būti keičiama iš išorės. Nekintamas objektas — tai tas, kurio būklė (jo savybių reikšmės) negali būti pakeistos po sukūrimo. Viešojo pobūdžio savybės buvimas prieštarauja nekintamumo principui:

Norint pasiekti nekintamumą, klasė turi atitikti šias sąlygas:

  • Visos savybės turi būti uždaros (private) arba apsaugotos (protected).
  • Neturi būti nustatymo metodų (metodų, kurie keičia savybių reikšmes).
  • Visos priklausomybės (objektai, su kuriais dirba ši klasė) taip pat turi būti nekintamos arba jų būklė neturi būti keičiama iš išorės.
  • Konstruktorius turi visiškai inicializuoti objektą, ir po to jo keisti negalima.
  • Jei reikalingi pakeitimai, turi būti kuriami nauji objekto egzemplioriai su naujomis reikšmėmis.

Pavyzdys klasės su vieša savybe (mutabilus):

<?php
class MutableObject
{
    public $value; // Vieša savybė

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

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

$obj->value = 20; // Reikšmė pakeista iš išorės

echo $obj->value; // 20

Pavyzdys nekintamos klasės:

<?php
class ImmutableObject
{
    private $value; // Uždara savybė

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

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

    // Metodas "pakeisti", kuris iš tikrųjų sukuria naują objektą
    public function withValue(int $newValue) : self
    {
        return new self($newValue);
    }
}

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

// $obj1->value = 20; // Klaida: Cannot access private property ImmutableObject::$value

$obj2 = $obj1->withValue(20); // Sukuriamas naujas objektas

echo $obj1->getValue(); // 10 (pirmasis objektas nepasikeitė)
echo $obj2->getValue(); // 20 (naujas objektas su pakeista reikšme)