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 (ახალი ობიექტი შეცვლილი მნიშვნელობით)