Hey NikiC, <http://ocramius.github.com/>
On Tue, May 4, 2021 at 4:21 PM Nikita Popov <nikita....@gmail.com> wrote: > On Tue, May 4, 2021 at 12:58 PM Marco Pivetta <ocram...@gmail.com> wrote: > >> Hey NikiC, >> >> On Tue, May 4, 2021, 12:34 Nikita Popov <nikita....@gmail.com> wrote: >> >>> Hi internals, >>> >>> I'd like to present an RFC for property accessors: >>> https://wiki.php.net/rfc/property_accessors >>> >>> Property accessors are like __get() and __set(), but for a single >>> property. >>> They also support read-only properties and properties with asymmetric >>> visibility (public read, private write) as a side-effect. >>> >>> The proposal is modeled after C#-style accessors (also used by Swift), >>> and >>> syntactically similar to the previous >>> https://wiki.php.net/rfc/propertygetsetsyntax-v1.2 proposal. >>> >>> While I put a lot of effort into both the proposal and the >>> implementation, >>> I've grown increasingly uncertain that this is the right direction for us >>> to take. The proposal turned out to be significantly more complex than I >>> originally anticipated (despite reducing the scope to only "get" and >>> "set" >>> accessors), and I'm sure there are some interactions I still haven't >>> accounted for. I'm not convinced the value justifies the complexity. >>> >>> So, while I'm putting this up for discussion, it may be that I will not >>> pursue landing it. I think a lot of the practical value of this accessors >>> proposal would be captured by support for read-only (and/or >>> private-write) >>> properties. This has been discussed (and declined) in the past, but >>> probably should be revisited. >>> >> >> I've skimmed the RFC: it will take a lot of testing to see how much this >> impacts BC, but potentially a lot. >> >> A few things that came up so far: >> >> * instead of allowing by-ref `get` declaration, can we just kill it >> here, before it breeds again? I don't think I need to explain the woes of >> by-ref to internals, but removing the ability to declare new accessors >> by-ref would be a huge win for the engine and the language long-term. >> > > The primary functionality by-ref get is needed for are operations on > arrays, such as $foo->bar[] = $val. This probably isn't particularly > important for explicit accessors, but may be a non-trivial limitation for > implicit ones. For example, you wouldn't be able to have a "public get, > private set" on an array property, for all practical purposes. Of course, > we could allow that to work fine for implicit accessors, without any > by-value vs by-reference get distinction. Would probably open up questions > regarding compatibility during inheritance though. > > Of course, I am generally sympathetic towards killing references with fire > :) > I'd strongly advise killing by-ref array push there: it's an acceptable limitation, for the amount of benefit we get :P In fact, people doing `__get` now are already familiar with "Indirect modification of overloaded property" (https://3v4l.org/6dTXK) As for use-cases around using by-ref, it is true that some of my libraries use by-ref to shadow/override object properties, but I'd rather kill the library than have by-ref proliferation. > * what does an array cast of an object with accessors look like? I assume >> only properties backed by storage will appear? (Yes, the array cast is >> still the simplest/most useful pure API to inspect object state 😁) >> > > That's correct. This is mentioned in > https://wiki.php.net/rfc/property_accessors#var_dump_array_cast_foreach_etc > (I've renamed the section to make it clearer.) > Thanks! Perhaps I missed it :-) > * what is the design decisions around same-visibility declarations >> causing compile errors in inheritance scenarios? Those would make BC >> unnecessarily complex, if a parent type declares a new accessor with the >> same name: variance is understandable, but same visibility errors seem a >> bit too much >> > > I'm not sure which error you're referring to here. Could you share an > example (or point me to the example in the RFC)? > >From this example: class Test { // Illegal: "public get" has higher visibility than "private $prop". private string $prop { public get; set; } // Illegal: "public get" has same visibility as "public $prop". // This visibility modifier is redundant and must be omitted. public string $prop { public get; private set; }} I'd perhaps mis-interpreted the error? Why is `public get` illegal? Also, is the example missing inheritance? Marco Pivetta http://twitter.com/Ocramius http://ocramius.github.com/