On Fri, Aug 5, 2022 at 10:25 PM Larry Garfield <la...@garfieldtech.com> wrote: > > On Fri, Aug 5, 2022, at 1:08 PM, Matthew Weier O'Phinney wrote: > > On Fri, Aug 5, 2022, 12:09 PM Larry Garfield <la...@garfieldtech.com> wrote: > > > >> Ilija Tovilo and I are happy to present the first new RFC for PHP 8.3: > >> Asymmetric Visibility. > >> > >> https://wiki.php.net/rfc/asymmetric-visibility > >> > >> Details are in the RFC, but it's largely a copy of Swift's support for the > >> same. > >> > > > > I have two comments: > > > > - For reflection purposes, having two separate methods feels like it will > > be cumbersome; you'd need to check both to determine if you'd need to make > > the reflection property accessible before changing the value. An > > isPublicSet() would alleviate that, or potentially a getSetFlags() method > > against which you could apply a bit mask. You'd need to add a constant for > > public set I both cases. > > Reflection is a mess, unfortunately. :-( > > There's already separate isPrivate(), isProtected(), and isPublic() methods > on ReflectionProperty, so this is consistent. Also, there's getModifiers() > which returns a bitmask; these new flags would be included there. All these > methods all do is check what is syntactically present, both the current ones > and proposed ones. > > There's definitely room in the Reflection API for a > "couldItBeModifiedFromScope($scope)" type method (and similar) that > aggregates together symmetric visibility, readonly, asymmetric visibility, > etc. into nice booleans. However, that is notably more work than just adding > more syntax flag methods. It would probably be better as its own RFC, though > I'd support that. > > If there's consensus that it has to be done here that could be done, but we'd > prefer not as it feels like scope creep. > > > - The number of items that appear to the left of a property is growing, > > making understanding a declaration increasingly difficult, and your > > discussion of future scope indicates that this is likely to get worse. I'm > > wondering if this sort of behavior could be indicated via attributes > > instead? Something like `#[PropertySetBehavior(PROPERTY_SET_PRIVATE)]`. > > Attributes have the benefit of being separate from the property > > declaration, arguably more readable (one per line), and composable. This > > might play into some of the future scope items as well. > > The list indeed groweth, but there's a couple of reasons it wouldn't be > appropriate here to use an attribute. > > * It would mean get-visibility is a keyword and set-visibility is an > attribute. That's weird and inconsistent. > * There's a strong sense from many on the list that attributes should not be > used for language behavior. Ilija agrees with that position, and I don't > care enough to fight it one way or the other. > * An attribute would be ignored in older PHP versions. For most attributes > that's OK, but in this case it would be a potential bug source. > Specifically, it would mean `#[PrivateSet] \n public string $value` would be > publicly settable on PHP 8.2, but not publicly settable in 8.3. That means > the integrity of the object is compromised on older versions. A keyword > would make that a syntax error, which in this case is preferable. > > > Overall, though, love the design simplicity! > > Yay! > > --Larry Garfield > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php >
Hello, First of all, this is exciting! Looking at the behavior for references, can we explore the edges a bit? (I didn't see any tests that cover this functionality in the PR) 1. Passing a function a reference to a private-set property is allowed, such as to sort(). 2. Returning a reference to a private-set property is allowed and usable. 3. Trying to get a NEW reference to a private-set property outside of the defined scope is not allowed. So if I'm understanding correctly, references to private-set properties can be used outside of the defined scope but they can't be created outside of the defined scope? If so, should we fire off a Notice when references are modified outside of the defined scope? I can see that being annoying in certain contexts, such as sorting an array, so maybe not? FWIW, this behavior doesn't apply to readonly properties because attempting to pass a reference to the property fails. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php