Middle
Эгер классда коомдук мүлк болсо, бул класс өзгөрүлгүс деп эсептелеби?
sobes.tech AI
AIден жооп
Жок:
Ачык мүлк класс ичинде бул мүлктүн мааниси тыштан өзгөртүлүшү мүмкүн дегенди билдирет. Иммутабельдүү объект — бул түзүлгөндөн кийин анын абалы (мүлк маанилери) өзгөртүлбөгөн объект. Ачык мүлктүн болушу иммутабельдүүлүк принципине каршы келет:
Иммутабельдүүлүккө жетүү үчүн класс төмөнкү шарттарды аткаруусу керек:
- Бардык мүлкдөр жабык (
private) же корголгон (protected) болушу керек. - Мүлктөрдүн маанилерин өзгөртчү (сеттер) методдор болбошу керек.
- Бардык көзкарандылык объектилер (бул класс иштеген объектилер) да иммутабельдүү болушу керек же алардын абалы тыштан өзгөртүлбөшү керек.
- Конструктор объектти толук инициализация кылышы керек жана ал түзүлгөндөн кийин өзгөртүлбөшү керек.
- Эгер өзгөртүүлөр талап кылынса, жаңы маанилер менен жаңы экземплярлар түзүлүшү керек.
Ачык мүлк менен класс мисалы (мутабель):
<?php
class MutableObject
{
public $value; // Ачык мүлк
public function __construct($value)
{
$this->value = $value;
}
}
$obj = new MutableObject(10);
echo $obj->value; // 10
$obj->value = 20; // Мүнөз өзгөрдү тыштан
echo $obj->value; // 20
Иммутабельдүү класс ишке ашырылышынын мисалы:
<?php
class ImmutableObject
{
private $value; // Жабык мүлк
public function __construct($value)
{
$this->value = $value;
}
public function getValue() : int
{
return $this->value;
}
// "Өзгөртүү" үчүн метод, чын эле жаңы объект түзөт
public function withValue(int $newValue) : self
{
return new self($newValue);
}
}
$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10
// $obj1->value = 20; // Ката: Cannot access private property ImmutableObject::$value
$obj2 = $obj1->withValue(20); // Жаңы объект түзүлөт
echo $obj1->getValue(); // 10 (баштапкы объект өзгөрбөйт)
echo $obj2->getValue(); // 20 (жаңы объект өзгөртүлгөн мааниге ээ)