On Sun, Jan 3, 2021, at 11:29 AM, Olle Härstedt wrote: > > I'll disagree slightly. A language feature should introduce more power than > > it does complexity. Not everything *can* be made absolutely simple, but the > > power it offers is worth it. I'd say it should minimize introduced > > complexity, relative to the power offered. Complexity ideally is super low, > > but it's never zero simply by virtue of being "one more thing" that > > developers need to know how to read. > > > > So in this case, we need to compare the power/complexity of asymmetric > > visibility vs the power/complexity of "immutable... except in these > > situations." I would argue that asymmetric visibility is more > > self-documenting, because it states explicitly what those situations are. > > > > The other point is that, as noted, "initonly" creates a gap if you have > > properties that are inter-dependent. Those then cannot be made public-read, > > because that would also mean public-clone-with, and thus allow callers to > > violate property relationships. Asymmetric visibility does not have that > > problem. > > Can you perhaps be a bit more clear on why initonly/readonly would be > a deal breaker? Seems to me like readonly would cover 80% of > use-cases? Which is to make data-value objects humane (and fast, since > you don't need getters anymore) to work with. Seems like you're > focusing too much on an edge case here. Maybe we should list the > possibly use-cases? Or at least the main target use-case. > > If an object has invariants that need to hold, just throw an exception > in __clone to force use with withX() instead? Or, as you suggested, > improve __clone by giving it arguments? > > Olle
It took a few days, but I am back with some more concrete examples. I decided to try and convert PSR-7 to the various options considered in my previous post. Here are the results: https://peakd.com/hive-168588/@crell/object-properties-part-2-examples Along with an analysis of the pros/cons of each. As shown there, `initonly` creates backdoors that make any but the most basic cases untennable. --Larry Garfield -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php