On Wed, 30 Dec 2020, 20:27 Larry Garfield, <la...@garfieldtech.com> wrote:
> > > > That's a good summary of why immutability and with-er methods (or some > > > equivalent) are more ergonomic. > > > > > > Another point to remember: Because of PHP's copy-on-write behavior, > full on > > > immutability doesn't actually waste that much memory. It does use up > some, > > > but far less than you think. (Again, based on the tests MWOP ran for > PSR-7 > > > a ways back.) > > > > I thought copy-on-write was only for arrays, not objects? > > > > Olle > > Copy on write applies to all values; the caveat is that with objects, the > value being copied is the handle that points to an object in memory, rather > than the object itself. That means passing an object by reference can do > some seriously unexpected things, which is why you basically never do so. > > The point here is that if you have an object with 15 internal properties, > it's memory usage is 15 zvals plus one zval for the object, plus one zval > for the variable that points to it. (I'm over-simplifying here. A lot.) > If you pass it to a function, only the one zval for the handle is > duplicated, which is the same as for an integer. > > If you clone the object, you don't duplicate 15+1 zvals. You duplicate > just the one zval for the object itself, which reuses the existing 15 > internal property entries. If in the new object you then update just the > third one, PHP then duplicates just that one internal zval and modifies the > new one. So you still are using only 18 zvals, not 36 zvals. (Engine > people: Yes, I am *very* over-simplifying. I know.) > > Basically, what in most languages would require manually implementing > "immutable data structures" we get for free in PHP, which is seriously > sweet. > > The net result is that a with-er chain like this: > > $foo2 = $foo->withBar('x')->withBaz('y')->withBeep('z'); > > is way, way less expensive than it looks, both on memory and CPU. It is > more expensive than setters, but not by much. > Ok. You have a benchmark for this? I can make one otherwise, for the query example. It worries me a little that immutablility is pushed into the ecosystem as a silver bullet. Main reason functional languages are using it is because ownership is a newer concept, so it hasn't been adapted as much. >