On Mon, Oct 19, 2020, 6:17 PM Theodore Brown <theodor...@outlook.com> wrote:
> On Mon, Oct 5, 2020 at 9:24 AM Nicolas Grekas <nicolas.gre...@gmail.com> > wrote: > > >> I'm wondering if the syntax that allows for several attributes is > >> really future-proof when considering nested attributes: > >> > >> > >> *1.* > >> #[foo] > >> #[bar] > >> > >> VS > >> > >> *2.* > >> #[foo, bar] > >> > >> Add nested attributes to the mix, here are two possible ways: > >> > >> *A.* > >> #[foo( > >> #[bar] > >> )] > >> > >> or > >> > >> > >> *B.* > >> #[foo( > >> bar > >> )] > >> > >> The A. syntax is consistent with the 1. list. I feel like syntax > >> B is not desired and could be confusing from a grammar pov. > >> BUT in syntax 2., we allow an attribute to be unprefixed (bar), > >> so that syntax B is consistent with 2. > >> > >> Shouldn't we remove syntax 2. in 8.0 and consider it again when nested > >> attributes are introduced? > >> > >> I voted yes for syntax 2. when the attributes were using << >>. I would > >> vote NO now with the new syntax. > >> > >> Nicolas > > > > As far as my understanding goes, if we introduce "nested" attributes, it > > will be in the form of relaxing constraints on constant expressions, i.e. > > by allowing you to write #[Attr(new NestedAttr)]. > > > > Nikita > > Back when the original `<<>>` attribute syntax was being implemented, > there was an attempt to do just this. But it turned out to be very > difficult to implement, and it was ultimately given up on since it > required significant changes to const expressions. Earlier this year > there was also a poll to gauge interest in supporting function calls > in constant expressions, but most voters opposed it. [1] > > Even if a proposal for relaxing constraints on constant expressions > gains enough support, it's not clear this is the ideal path forward > for nested attributes, since as Nicolas pointed out this wouldn't > have the same lazy-loading semantics as existing attributes. > > Straightforward support for nested attributes was one of my main > motivations for proposing the `@@` syntax in the Shorter Attribute > Syntax RFC, [2] and I had hoped to collaborate on a follow-up RFC to > support nested attributes with the AT-AT syntax. This would allow > existing nested docblock annotations such as Nicolas's example to > translate intuitively to native attributes: > > @@Assert\All([ > @@Assert\Email, > @@Assert\NotBlank, > @@Assert\Length(max: 100) > ]) > > This would also preserve the lazy-loading feature where these > attribute classes aren't loaded until code calls `newInstance` > on one of the `ReflectionAttribute` objects. > > But then the Shorter Attribute Syntax Change RFC [3] came along and > derailed this plan... > > In theory nested attributes could be supported in the same way with > the `#[]` syntax, but it's more verbose and I think less intuitive > (e.g. people may try to use the grouped syntax in this context, but > it wouldn't work). Also the combination of brackets delineating both > arrays and attributes reduces readability: > Welp, both variants seem to be readable. > #[Assert\All([ > #[Assert\Email], > #[Assert\NotBlank], > #[Assert\Length(max: 100)] > ])] > > But at this point I assume this is the most viable path forward for > nested attributes (barring another syntax re-vote and delay of PHP 8). > Are you actually kidding me? 4th revote? Please no. I know Derick and Benjamin have stated they aren't in favor of nested > attributes and didn't put any thought into the syntax for them, but I > feel this is unfortunate since nested attributes are an established > pattern with legitimate use cases in existing libraries. > > Best regards, > Theodore Best regards, Benas > > [1]: https://wiki.php.net/rfc/calls_in_constant_expressions_poll > [2]: https://wiki.php.net/rfc/shorter_attribute_syntax > [3]: https://wiki.php.net/rfc/shorter_attribute_syntax_change > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php >