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