Sobes.tech
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 (жаңы объект өзгөртүлгөн мааниге ээ)