Re: [RFC] Property hooks, nee accessors

From: Date: Wed, 10 May 2023 13:18:50 +0000
Subject: Re: [RFC] Property hooks, nee accessors
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-120225@lists.php.net to get a copy of this message
On Wed, May 10, 2023, at 11:35 AM, Robert Landers wrote: >> Regarding $field vs. $this->propName, there's a few reasons we went that route. >> >> 1. It's shorter and less typing for what will be a common pattern. >> 2. That makes it consistent between hook implementations. In working on examples, I found >> many cases where I was adding basically the same line to multiple hooks on the same class. Making >> the code easier to copy-paste seems like a win. >> 3. It also will be helpful if hook packages are added in the future, as they'll need a >> more "generic" way to access the backing property. (See Future Scope.) Eg, "$field >> = someLogic($value)" applied to a dozen different properties; it wouldn't work if it was >> "$this->specificProperty = someLogic($value)". >> 4. We're used to our eyes glossing over "$this->propName", as it's >> so common. Having a separate name to mentally scan for to determine if a property is virtual or not >> seems like it will be helpful in practice. >> 5. There's precedent for it: Kotlin has almost the same functionality as we describe >> here, and uses a field variable in the exact same way. >> >> So it's mainly an ergonomics argument rather than a technical one. "Compile time >> macro" means it translates to the same AST as if you'd used $this->propName. >> There's precedent for that. Constructor Property Promotion works basically the same way. > > With using a common name for say, $value, open the door for a library > of common hook implementations (eventually)? > > Maybe something like: > > class User { > // snip > public string $fullName { get => FancyLibrary\fullName(...) } > // snip > } > > I could imagine something like this would be a huge boon to PHP if it > automatically bound the closure. $field is only available inside the hook itself, not inside functions called from it. But that does mean you could do this instead: class User { // snip public string $fullName { get => FancyLibrary\fullName($field) } // snip } Which, yes, should work fine. If such a library actually became popular, that would be an argument to implement the "property hook packages" or "property traits" concept that Swift has, as noted in Future Scope. --Larry Garfield

« previous php.internals (#120225) next »