@lemonlimelike

Как предотвратить изменение переменной?

Всем привет! Очень интересная проблема появилась. Имеется метод, который принимает объект Point.
private function removeIntervals(Point $item, $service)
    {
       ...
       ...
        // dd($service, $item->getDate());
        $timeWork = $item->getStartTime()->diff($item->getEndTime());
        $startTime = $item->getStartTime(); // Метод getStartTime() возвращает время 13:00 и присваивается переменной startTime
        $endTime = $item->getEndTime();
        $subTime = $startTime->sub($timeWork); // А тут получается, что в переменную subTime ставиться значение startTime но с некими вычислениями
        $addTime = $endTime->add($timeWork);
    }

И в результате получается , что в объекте Point метод getStartTime() будет возвращать мне уже 12:10, а не 13:00
Я понимаю, что произошли некие операции в значения поменялись. Но почему в переменной startTime значение изменилось? Потому что тут везде все работает по ссылкам? Но как мне сделать, чтоб в startTime было постоянно 13:00, потому что в результате в startTime тоже будет 12:10. Объясните плиз, что не так с php или моими руками?))
  • Вопрос задан
  • 158 просмотров
Решения вопроса 1
@Vitsliputsli
Но почему в переменной startTime значение изменилось?

Потому что в startTime ссылка на объект полученный через $item->getStartTime();

Потому что тут везде все работает по ссылкам?

Не везде, но при работе с объектами применяются ссылки.

Но как мне сделать, чтоб в startTime было постоянно 13:00

Не изменяйте существующий объект startTime, создайте новый объект на основе времени в startTime. Что-то вроде:
(new DateTime())
->setTimestamp($item->getStartTime()->getTimestamp())
->setTimezone($item->getStartTime()->getTimezone())

Можно, конечно, и склонировать, но по сути это совсем другой объект, хоть вы и используете для его создания данные из startTime.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

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

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