Sobes.tech
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)