On Sat, Sep 14, 2019 at 10:47 AM Mike Schinkel <m...@newclarity.net> wrote:
> > On Sep 13, 2019, at 3:18 AM, Rasmus Schultz <ras...@mindplay.dk <mailto: > ras...@mindplay.dk>> wrote: > > > > Assuming the fields of this entity are required, you would probably > prefer > > to add a constructor - but then property initializers aren't really > useful > > anymore. > > I think this is a false dichotomy; I can see benefit to having > initializers in addition to constructors, even for the same classes. > > However, Object Initializers might be best when paired with a new magic > method which let us call __init(), and a required modifier for properties. > > Using your Customer example, the __init() would be automatically called > after __construct(): > > class Customer > { > private string $name = ''; > required protected ?string $email = null; > > public function __construct(string $name, ?string $email = null) > { > $this->name = $name; > $this->email = $email; > } > > public function __init() > { > $this->name = ucwords($this->name); > $this->email = sanitize_email($this->email); > } > } > > With __init() a developer could separate capturing construct parameters > from initializing required fields, but the required modifier would allow > developers to indicate which properties should be required. > > And it might even make sense to throw an error if an object initializer > does not have an __init() method. Requiring __init() would ensure that > classes not designed to work with initializers would never be initialized > without required fields set. > > When creating an object using object initialization I think it should just > bypass and only call __init(). PHP could generate an error if any required > fields are not set. > > $customer = new Customer{ > name => 'mike schinkel', > email => 'm...@newclarity.net <mailto:m...@newclarity.net>' > } > echo $customer->name; // Prints "Mike Schinkel" > > Actually, a required modifier would not be required to implement object > initializers (no pun intended) but it would enable IDEs, PHP and other > tools validate whether or not a required fields has been set. > > As an aside, it would be interesting if there were a __validate() magic > method although it might harm performance too much. OTOH, it should not > harm performance unless you actually use it: > > public function __validate(string $field):bool > { > switch ($field) { > case 'name': > return !empty( $this->name ) && strlen($this->name) >= 3; > case 'email': > return validate_email($this->email); > } > return true; > } > > > a desire to use this language feature will drive architecture. ... this > will > > provide the wrong kind of motivation to make what are, effectively, > > architectural decisions. > > The reason I badly want object initializers is to empower architectures > that currently are not possible in PHP. So I see this as a positive. > > I see architectures used in other languages that reduce tedium and enhance > reusability that we cannot implement in PHP because of lack of an object > initializer. > > But maybe I do not realize what you are seeing? Can you please elaborate > on the architectures you fear will emerge, ideally with examples and > reasons why they should be avoided? > > > -Mike > > Hey Mike, lazy initialisation is already possible in userland: adding more magic to the language for a use-case that is already implemented seems problematic to me. Marco Pivetta http://twitter.com/Ocramius http://ocramius.github.com/