Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:111959 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 87521 invoked from network); 29 Sep 2020 14:45:53 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 29 Sep 2020 14:45:53 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 809DE1804AA for ; Tue, 29 Sep 2020 06:57:32 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, SPF_HELO_NONE,SPF_NONE autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Tue, 29 Sep 2020 06:57:30 -0700 (PDT) Received: by mail-wm1-f44.google.com with SMTP id d4so4725575wmd.5 for ; Tue, 29 Sep 2020 06:57:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=beberlei-de.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=s8HwvP1nNtWDBpR1ZTi5LGDkHGEqYKaHljU+/0S7oSw=; b=XGZAhHmbXOaw+rtOpmN3qQybIWapVU4wfKecUPyRR7RLjiwh36ldZJcXKfsLejcVKG nRuBP99g82jXySNRQSrSwR1TRS/wqE5zjS3aq+fz1uXlAb8/gGVZwF7Yxt/06wzXtRg+ tzkL/0dxeOoQv32hE7LLdFgQl9tNPqhbQi7/OLtR1x1QFRKHeX3KDdez+eIZ5RBwb8Bk NzHQdh4jKxNK5WPg3O8azGYNj6bNkOd+pm+ZwECS9/Qd/z9QZUKHdCQaMVVF2V2LmA9J EXxDfQLEI3Ybaa3jSzRak/7UShKApZrtBE9MCLqWfbhKfJtxxLNiRows66kfoFtRdm9E nP5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=s8HwvP1nNtWDBpR1ZTi5LGDkHGEqYKaHljU+/0S7oSw=; b=ofdlGzOZhLSJn4q+wTfqodsi9VasEjBuVA0U8C2Poko6fJbeyxA3ZKl4QlRSSK4caN a3U2HSqSehTU0RU6XS6s/dscu8WQ7zojd0VFLjB9E21GvXYm687mq73sS/+biju6fgC1 NnzxO8/oTKh1DTKlrTbKJ2aWJISpujGlecPoRyfyej3kd8Hepxfw932qnXTDErbM2UM+ 1i3HliRPYODKuJSi7gh7+q1b4KnyQUf7Eq7v1tLkgSeDyU9yT3Kob/EOtzCiJltJr4mg rDMZv2jaZ7R/+DdIxuoBfo61al6OUSAQ1UD+CJXIqq+VHJgwhTQImGOYAuThYLYpzQHW jkcw== X-Gm-Message-State: AOAM531/lC+fjnMO7Qh3n9BUa/iUh0AJKntX8M3mZHRURXFC/H8xqnBm p4OJ5VbBGtGgKK6hm0fpa91GAIVRYzN7Y0Hk6oBQIdzCCpc= X-Google-Smtp-Source: ABdhPJxAMNKPuEAp/RN9P0RWiuLdX5pAutpzT7ycHj1BglWGRAoyCH8WAMYRx1aaUsLGjKjC620bQRLMjjQvLoU1WCo= X-Received: by 2002:a1c:2cc4:: with SMTP id s187mr4675444wms.36.1601387845381; Tue, 29 Sep 2020 06:57:25 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Tue, 29 Sep 2020 15:57:14 +0200 Message-ID: To: Larry Garfield Cc: php internals Content-Type: multipart/alternative; boundary="000000000000ac01a305b07429a9" Subject: Re: [PHP-DEV] Re: Attributes and constructor property promotion From: kontakt@beberlei.de (Benjamin Eberlei) --000000000000ac01a305b07429a9 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Sep 29, 2020 at 3:45 PM Larry Garfield wrote: > On Mon, Sep 28, 2020, at 12:06 PM, Benjamin Eberlei wrote: > > On Mon, Sep 28, 2020 at 4:35 PM Benjamin Morel > > > wrote: > > > > > On Mon, 28 Sep 2020 at 15:17, Nicolas Grekas < > nicolas.grekas+php@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 applie= s > 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 th= e > > expected approach, and users could change it to apply only to propertie= s, > > which is what is the use-case that makes most sense. > > > > > > > > =E2=80=94 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. > The problem with this approach is that it would require autoloading the attributes when they are assigned to either the internal property or parameter struct, but we have the design goal *not* to trigger autoloading unless newInstance() or getArguments() is called. What you could do in userland code is handle this case yourself and never newInstance() attributes that don't apply to the right "thing" (parameter vs property). but that would defer the problem to userland with some annoying piece of code. > --Larry Garfield > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php > > --000000000000ac01a305b07429a9--