On Mon, Sep 28, 2020, at 12:06 PM, Benjamin Eberlei wrote:
> On Mon, Sep 28, 2020 at 4:35 PM Benjamin Morel <benjamin.mo...@gmail.com>
> wrote:
> 
> > On Mon, 28 Sep 2020 at 15:17, Nicolas Grekas <nicolas.grekas+...@gmail.com>
> > wrote:
> >
> >> I assume the 80% case is properties, because attributes did not have
> >>> docblock annotations yet, that means this use-case isn't even possible at
> >>> the moment. Yet annotations on properties are widespread (Doctrine ORM,
> >>> symfony validator, ...).
> >>>
> >>
> >> I'm 100% with Benjamin here, this is what will be the most useful to me
> >> also.
> >>
> >
> > To be clear, I don't have a strong opinion against yours, I'm just
> > pointing out the fact that even though it might be useful, it might also be
> > confusing and create yet another WTF moment in PHP for developers. Sure, it
> > might make more sense to apply to the property. Sure, so far annotations
> > weren't possible on parameters. But is that obvious to the average
> > developer writing the attribute? A few years down the road, DI containers
> > may have broad support for annotating parameters for injection. Will it
> > still be obvious then that an attribute on a promoted property applies to
> > the property only?
> >
> > I do agree that applying the attribute to both the property and the
> > parameter will probably never be useful, though. So, throwing an exception
> > and forcing the de-sugaring feels like the most sensible thing to do for me
> > in this case!
> >
> 
> I haven't checked if this is possible in the code doing the "desugering",
> but what if we had an attribute on the constructor that could specify where
> the attributes should apply to?
> 
> #[AttributePromotion(Attribute::TARGET_PROPERTY)]
> public function __construct(#[Foo] public string $bar) {}
> 
> Then we could apply it to both by default, which is what is probably the
> expected approach, and users could change it to apply only to properties,
> which is what is the use-case that makes most sense.
> 
> >
> > — Benjamin

>From a user experience POV, I'd almost expect the opposite.

If I mark the attribute as being for properties, it gets applied to the 
property.

If I mark the attribute as being for parameters, it gets applied to the 
parameter.

If I mark it for both, or don't restrict it at all, it applies to both.

That may not be how the logic is currently implemented but that's what as a 
user I'd find least-surprising.

--Larry Garfield

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to