Как стать автором
Обновить

Комментарии 13

Я бы обобщил — делайте Value Objects иммутабельными, DateTime в том числе :)
Carbon предоставляет как мутабельный так и иммутабельный варианты.

Поддерживаю!

Отвыкнув клонировать объекты, большая часть начинающих программистов в других объектах все же столкнется с этим задекларированным свойством всех объектов. Каждому классу следует делать Immutable-оболочку, или в DateTime есть какая-то особенность?
Жду статью «Перестаньте плодить Immutable-оболочки. Используйте директиву clone».
Работа с датами и временем в PHP порой раздражает, поскольку приводит к неожиданным багам в коде
Игнорирование документации еще и не к таким багам может привести. В документации черным по белому написано:
Adds an amount of days, months, years, hours, minutes and seconds to a DateTime object
Как тогда можно ожидать от кода в примере иного поведения?

$finishedAt = (clone $startedAt)->add(new DateInterval('PT3M'));

Этот код тоже некрасивый с множеством ненужного шума?

Ага, ваш код потенциально опасен баном если забыть написать clone, а имутабл код опасен если забыть назначить новой переменной. Вообще опасно забывать в программировании

Когда впервые после PHP столкнулся с Python'ом был крайне удивлен, что словари и списки являются мутабельными, словил на этом немало багов на первых порах, все потому, что не прочитал базовую спецификацию языка, но почему-то мне в голову не пришло писать статью об этом.
Странно, что архитекторы сделали возвращаемое время у add/modify.
Обычно если возвращает, то это копия.

Это распространённая практика, которая называется chainable methods (методы, которые можно выстраивать в цепочку)

В PHP все объекты передаются по ссылке, нельзя передать объект по значению без клонирования, а возврат значения сделали для реализации FluentInterface скорее всего, чтобы можно было делать цепочку вызовов.

Ну скорее объекты в PHP передаются через указатель на указатель. Для передачи его по ссылке надо использовать "&".


P.S. Передача объекта по ссылке — это очередная путаница в документации, такая же как и со "свойствами", которых в PHP просто нет и такая же как и с Closure, который является анонимной функцией, а замыканием лишь в частных случаях (за исключением короткого синтаксиса).

Откровенно странная проблема… и не могу сказать чтобы текущее поведение DateTime меня напрягао… Работает согласно документации — в чем проблема вообще?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий