Hi Andrea,

Andrea Faulds wrote on 17/11/2015 01:47:
Larry Garfield wrote:
The "everything in the constructor" is the problem.  That results in,
essentially, an obscenely long function call that just happens to be
named __construct().  If I wanted something that obscure and hard to
work with I'd just use anonymous arrays. :-)

Huh?

"with" methods and __construct are not exclusive. In fact, you could have a private constructor and only have "with" methods. Only allowing assignment to properties in the constructor doesn't prevent having a nice API: have your methods call the constructor.

I don't see what you're getting at here.


Making the "with" methods wrap the constructor tidies the public API, but that (private) constructor needs to be just as complex as Larry said earlier - you've got to manually extract all the properties of one instance, and pass them as parameters to the other. Or, you could copy them one by one inside the body of the constructor, which comes to the same thing - lots of boilerplate.

If you look at the PSR-7 implementation I linked to earlier [1], there's no such boilerplate, just a single call to "clone $this", and PHP does it all for you. But that doesn't work with a simplistic definition of immutable like "mutable in constructor" or "mutable until non-null"; you need to be able to "freeze" an instance once you've set it up, or have privileged (private) methods which are allowed to mutate the properties.

[1] https://github.com/guzzle/psr7/blob/master/src/Request.php#L101

Regards,
--
Rowan Collins
[IMSoP]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to