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