Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:111961 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 62189 invoked from network); 30 Sep 2020 11:33:35 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 30 Sep 2020 11:33:35 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 24A53180510 for ; Wed, 30 Sep 2020 03:45:27 -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.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,FREEMAIL_REPLY, HTML_MESSAGE,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com [209.85.208.179]) (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 ; Wed, 30 Sep 2020 03:45:26 -0700 (PDT) Received: by mail-lj1-f179.google.com with SMTP id b19so1132202lji.11 for ; Wed, 30 Sep 2020 03:45:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=ag4rfaWTUt0kuSsq3vZlrjZZXnfiFSXcmDbsUfWkofo=; b=VieTn0fZbM04MZilerlxg8X2Fw8cDrxuWKkWIkQ4wgUh2rQCA5C31X9TvttN80dwQO JfKaF5kbtaNw8GNU0RvPzFH37XmU1CV9ydixpQXpBMTyYPeTODOZ0tKjxfIzPJ/AmIcn AdNP8MicH5saNQWLC7KOkPQKd4oTV/+boPgxiOMpiJXw6Vyjv4cdi0HbdVFaflHpUzZp 7N+4MYu0GgoioU40toFkHr+ElY+Qp1jqah8oLPMpjviCBU80E9nHoXvkvzTM/L1n7QEs 8VlEfe8VkIGC2V6bS00pTefBiQZFaxxsE+i+liBJo1brmkiTIN2TLQQd/Zepx8p2ZeAd 4Hrw== 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=ag4rfaWTUt0kuSsq3vZlrjZZXnfiFSXcmDbsUfWkofo=; b=pq9drdMA/qJXH9wWouimSZ6iEK4C5agUdT5HjZT1mK6nQOmL7X5DhvEpyxLcubV5Fv lrQLVeWDpiEjiGX2INrDOiIqmH1sT4iA9o+KBnTZn/i0WAaK2FNTZJXMIK+7JWtOgVsC w5YwoYctj+ZbygeWwBE0LFtmSOoTcZ/z/3W0qo1b0dccqRy+wSUhUIRRSdr9D8mrem6v Gu5V7QRNSrYRftviEaCNej93XrUNbotS5KuXfe2WQZLTDucUUhqFCnexxAxKwdltMu9e YV9IhkywBeGaEuxwy9NkBIg0oYy110QCBOwaafr1Axq+uZYi90sdBvAGxJnzrS1xKVOk 5G1A== X-Gm-Message-State: AOAM533X+qNqL8y+7z5q9HRd3ctSzFkr8/s27r++RQ1sQ+Jht0yodn7G P2glkYrKEE+hLRDXF3IuCjJvZn1vMv9QEW2/clY= X-Google-Smtp-Source: ABdhPJzcrNP7ROjpBHnC3xs1r3xUwwYpmfDyxrOf/apaHUEIwu9lpVsRb4vMmj6JK8CoKafYlo8pxxPoOTilG25j2Fk= X-Received: by 2002:a2e:b0d6:: with SMTP id g22mr635514ljl.350.1601462725103; Wed, 30 Sep 2020 03:45:25 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Wed, 30 Sep 2020 12:45:09 +0200 Message-ID: To: Benjamin Eberlei Cc: Larry Garfield , php internals Content-Type: multipart/alternative; boundary="000000000000d9d62405b0859897" Subject: Re: [PHP-DEV] Re: Attributes and constructor property promotion From: nikita.ppv@gmail.com (Nikita Popov) --000000000000d9d62405b0859897 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Sep 29, 2020 at 3:57 PM Benjamin Eberlei wrote: > 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 < > benjamin.morel@gmail.com > > > > > > 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 ha= ve > > > >>> docblock annotations yet, that means this use-case isn't even > > possible at > > > >>> the moment. Yet annotations on properties are widespread (Doctrin= e > > 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. Wil= l > 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 d= o > > 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. > > > > > > > > > > > =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 autoloadin= g > 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. > So, as there seems to be resistance to applying the attribute to properties only I only see a couple of options: 1. Forbid combining attributes and promotion. 2. Relax attribute validation for this case, as implemented in https://github.com/php/php-src/pull/6244. I think if we otherwise stick to the current behavior, this is what we should do to avoid false-positive errors. 3. Disambiguate what is desired somehow. __construct(#[PropAttr] public int $x) vs __construct(public #[ParamAttr] int $x). This is ... a bit too much magic :) Nikita --000000000000d9d62405b0859897--