Middle
Vai tas nozīmē, ka klase ir nemainīga, ja tai ir publiska īpašība?
sobes.tech AI
Atbilde no AI
Nē.
Publiskā īpašība klasē nozīmē, ka šīs īpašības vērtība var tikt mainīta ārpus objekta. Nekustams objekts ir tas, kura stāvoklis (tās īpašību vērtības) pēc izveides nevar tikt mainīts. Publiskās īpašības esamība ir pretrunā ar nekustamības principu:
Lai sasniegtu nekustamību, klasei jāatbilst šādiem nosacījumiem:
- Visas īpašības jābūt slēptām (
private) vai aizsargātām (protected). - Nedrīkst būt sēteru (metožu, kas maina īpašību vērtības).
- Visas atkarības (objekti, ar kuriem strādā šī klase) arī jābūt nekustamām vai to stāvoklis nedrīkst tikt mainīts ārpusē.
- Konstruktoram jāveic pilnīga objekta inicializācija, un pēc tam to nevar mainīt.
- Ja nepieciešami mainījumi, jāizveido jauni objekta eksemplāri ar jaunām vērtībām.
Piemērs ar publisku īpašību (maināmu) klasi:
<?php
class MutableObject
{
public $value; // Publiska īpašība
public function __construct($value)
{
$this->value = $value;
}
}
$obj = new MutableObject(10);
echo $obj->value; // 10
$obj->value = 20; // Vērtība mainīta ārpusē
echo $obj->value; // 20
Piemērs ar nekustamu klasi:
<?php
class ImmutableObject
{
private $value; // Slēpta īpašība
public function __construct($value)
{
$this->value = $value;
}
public function getValue() : int
{
return $this->value;
}
// Metode "mainīt", kas patiesībā izveido jaunu objektu
public function withValue(int $newValue) : self
{
return new self($newValue);
}
}
$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10
// $obj1->value = 20; // Kļūda: Cannot access private property ImmutableObject::$value
$obj2 = $obj1->withValue(20); // Tiek izveidots jauns objekts
echo $obj1->getValue(); // 10 (pirmā objekta vērtība nemainās)
echo $obj2->getValue(); // 20 (jauns objekts ar mainītu vērtību)