Sobes.tech
Middle

Արդյո՞ք դա նշանակում է, որ դասը անփոփոխ է, եթե դասում կա հանրային հատկություն։

sobes.tech AI

Պատասխան AI-ից

Ոչ:

Հանրային հատկությունը դասում նշանակում է, որ այս հատկության արժեքը կարող է փոփոխվել օբյեկտից դուրս: Անվտանգ օբյեկտը այն է, որի վիճակը (այնուամենայնիվ նրա հատկությունների արժեքները) չի կարող փոխվել ստեղծելուց հետո: Հանրային հատկության առկայությունը հակասում է անփոփոխության սկզբունքին:

Անփոփոխության հասնելու համար դասը պետք է համապատասխանի հետևյալ պայմաններին:

  • Բոլոր հատկությունները պետք է լինեն փակ (private) կամ պաշտպանված (protected):
  • Չպետք է լինեն սեթերներ (մեթոդներ, որոնք փոխում են հատկությունների արժեքները):
  • Բոլոր կախվածությունները (օբյեկտները, որոնց հետ աշխատում է այս դասը) նույնպես պետք է լինեն անփոփոխ կամ նրանց վիճակը չպետք է փոխվի օտարից:
  • Կոնստրուկտորը պետք է լրիվ initialize անի օբյեկտը, և այն չի կարող փոխվել ստեղծելուց հետո:
  • Եթե անհրաժեշտ է փոփոխություն, պետք է ստեղծել նոր օրինակ՝ նոր արժեքներով:

Նմուշ դասի հետ հանրային հատկությամբ (փոփոխական):

<?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 (նոր օբյեկտը փոխված արժեքով)