Sobes.tech
Middle

Оё ин маъно дорад, ки синф беэътибор аст, агар дар синф хусусияти умумӣ дошта бошад?

sobes.tech AI

Ҷавоб аз AI

Нест.

Ҷойи умумӣ дар синф маъно дорад, ки арзиши ин хусусият метавонад аз берун аз объект тағир ёбад. Объекти тағирнопазир (immutable) он аст, ки ҳолати он (арзиши хусусиятҳои он) пас аз эҷод кардан тағир намеёбад. Ҳузури хусусияти умумӣ зидди принсипи тағирнопазирӣ мебошад.

Барои расидан ба тағирнопазирӣ, синф бояд ба шароитҳои зерин ҷавобгӯ бошад:

  • Ҳамаи хусусиятҳо бояд хусусӣ (private) ё муҳофизатшуда (protected) бошанд.
  • Ҳеҷ гуна setter (усулҳое, ки арзиши хусусиятҳоро тағир медиҳанд) набояд бошанд.
  • Ҳамаи вобастагиҳо (объектҳое, ки синф бо онҳо кор мекунад) низ бояд тағирнопазир бошанд ё ҳолати онҳо аз берун тағир ёбад наметавонад.
  • Конструктор бояд пурра объектро оғоз кунад ва пас аз эҷод кардан тағир наёбад.
  • Агар тағирот зарур бошад, бояд намунаҳои нав бо арзишҳои нав эҷод шаванд.

Масалан, синф бо хусусияти умумӣ (мутаҳаррик):

<?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; // Хатогӣ: дастрасӣ ба хусусияти хусусӣ ғайриимкон аст

$obj2 = $obj1->withValue(20); // Навъи нав эҷод мешавад

echo $obj1->getValue(); // 10 (объекти аслӣ тағир наёфтааст)
echo $obj2->getValue(); // 20 (объекти нав бо арзиши тағирёфта)