Как сохранить в переменную объект с другим свойством не изменяя объект?

Здравствуйте, есть код:
class test {

    public $var = 'variable';

    public function setVar($param) {
        $this->var = $param;
    }

}

$Obj = new test();
$str = $Obj->setVar('new variable');


Я что-то туплю, как в переменную $str сохранить объект с измененным свойством не затронув оригинал?

Конечно, можно сделать так:
$Obj = new test();
$Obj2= clone $Obj;
$str = $Obj2->setVar('new variable');

Но, так нельзя)) Что-то в самом методе сделать? Пробовал статическим метод сделать, но...

На конструктор и модификаторы доступа не обращайте внимание.
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 3
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
Ну через клон будет правильно
Вообще конструктор будет не лишним
Сохранить стандартное значение можно в свойстве и при желании его дергать
Все свойства должны быть приватными или защищенными
Если кодом, то есть варианты иммутабельности
class Test
{
    private $array = [];

    public function __construct(array $array)
    {
        $this->array = $array;
    }

    public function immutable(): self
    {
        return clone $this;
    }

    public function limit(int $limit, int $offset = 0): self
    {
         return new self(array_slice($this->array, $offset, $limit));
    }
}

Далее уже работать через метод, либо делать методы которые возвращают новый объект
Ответ написан
Комментировать
@ramiloremispum
Backend Web-dev
В частном случае можно в методе создать новый объект:
class test {

    public $var = 'variable';

    public function setVar($param) {
        $self = new self();
        $self->var = $param;
        return $self;
    }

}

$Obj = new test();
$Obj2 = $Obj->setVar('new variable');

echo $Obj->var;
echo $Obj2->var;
Ответ написан
Комментировать
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Рассматривай обьект как ящик с данными.
Создал ящик. Положил туда что-то. На ящик навесил ярлык с переменной.
Хочешь другой обьект - это другой ящик создавай новый или копируй (через клонирование) старый. Можешь в переменную положить другой ящик.

Но помни что если ни одна из переменных не содержит информацию о твоем ящике, то ты его потерял.
То есть
$obj = new Obj;
$obj = new Obj;

дважды создал ящик и присвоил туда же - в итоге первый ты потерял, на него больше никто не ссылается и он будет удален. То же и со строкой будет если в одну переменную две строки положить - то первая же удалится.

Создавай вторую. И там играйся со вторым ящиком
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы