Middle
Kas see tähendab, et klass on muutumatu, kui sellel on avalik omadus?
sobes.tech AI
Vastus AI-lt
Ei.
Avalik omadus klassis tähendab, et selle omaduse väärtust saab väljast muuta. Muudetu objekt on see, mille seisundit (oma omaduste väärtusi) ei saa pärast loomist muuta. Avaliku omaduse olemasolu on vastuolus muutumatuse põhimõttega:
Muudetamatuse saavutamiseks peab klass vastama järgmistele tingimustele:
- Kõik omadused peavad olema privaatsed (
private) või kaitstud (protected). - Ei tohi olla setter-meetodeid (meetodeid, mis muudavad omaduste väärtusi).
- Kõik sõltuvused (objektid, millega see klass töötab) peavad samuti olema muudetamatud või nende seisundit ei tohi väljast muuta.
- Konstruktor peab täielikult initsialiseerima objekti ning seda ei tohi pärast luua muuta.
- Kui on vaja muudatusi, tuleb luua uued eksemplarid uute väärtustega.
Näide avaliku omadusega (muudetav) klassist:
<?php
class MutableObject
{
public $value; // Avalik omadus
public function __construct($value)
{
$this->value = $value;
}
}
$obj = new MutableObject(10);
echo $obj->value; // 10
$obj->value = 20; // Väärtus muudetud väljastpoolt
echo $obj->value; // 20
Näide muutumatust klassist:
<?php
class ImmutableObject
{
private $value; // Privaatne omadus
public function __construct($value)
{
$this->value = $value;
}
public function getValue() : int
{
return $this->value;
}
// Meetod "muutmiseks", mis tegelikult loob uue objekti
public function withValue(int $newValue) : self
{
return new self($newValue);
}
}
$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10
// $obj1->value = 20; // Viga: Cannot access private property ImmutableObject::$value
$obj2 = $obj1->withValue(20); // Loob uue objekti
echo $obj1->getValue(); // 10 (esimene objekt ei muutu)
echo $obj2->getValue(); // 20 (uus objekt muudetud väärtusega)